木棒

题目描述

现有n根木棒,已知它们的长度和重量。要用一部木工机一根一根地加工这些木棒。该机器在加工过程中需要一定的准备时间,是用于清洗机器,调整工具和模板的。木工机需要的准备时间如下:
(1)第一根木棒需要1min的准备时间;
(2)在加工了一根长为l,重为w的木棒之后,接着加工一根长为ll(l<=ll),重为ww(w<=ww)的木棒是不需要任何准备时间的。否则需要一分钟的准备时间。
给定n根木棒,你要找到最少的准备时间。例如现在有长和重分别为(4,9),(5,2),(2,1),(3,5)和(1,4)的五根木棒,那么所需准备时间最少为2min,顺序为(1,4),(3,5),(4,9),(2,1),(5,2)。

输入

输入包含多组测试数据。输入的第一行是一个整数T,表示测试数据的个数。
每个测试例两行:
第一行是一个整数n(1<=n<=5000),表示有多少根木棒;
第二行包括n*2个整数,表示了l1,w1,l2,w2,l3,w3,...,ln,wn,这些数均不大于10000,其中li和wi表示第i根木棒的长度和重量。

输出

输出以分钟为单位的最少准备时间。

样例输入

3 
5 
4 9 5 2 2 1 3 5 1 4 
3 
2 2 1 1 2 2 
3 
1 3 2 2 3 1

样例输出2

1
3




题意描述:

       输入n(1<=n<=5000)表示木棒数,接着输入n对数表示该木棒的长度l和质量w(均不大于10000)

计算并输出加工完这些木棒所需要的最少加工时间

   解题思路:

        刚开始以为以第一根最小的木棒为参照,一直到做完满足这个参照的木棒,最后才发现参照木棒是需要变换的,相当于求该串数有几个上升序列。

        先将该串数存为结构体数组(成员分别有长度l,重量w,是否加工过标志z),排序,for循环用长度相对最小的那根木棒为参照,找到满足条件的最近的木棒,变换参照,

继续往后加工,直到加工完满足条件的,每次开头计数变量c加1,最后输出即可。

代码实现:

 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std;
 4 struct m
 5 {
 6     int l,w,z;
 7 };
 8 bool cmp(struct m  x,struct m  y)
 9 {
10     if(x.l<y.l)
11     return true;
12     else if(x.l==y.l)
13     {
14         if(x.w<y.w)
15         return true;
16         else
17         return false;
18     }
19     else
20     return false;
21 }
22 
23 int main()
24 {
25     int t,n,i,c,j,l,w;
26     struct m b[5001];
27     scanf("%d",&t);
28     while(t--)
29     {
30         scanf("%d",&n);
31         for(i=0;i<n;i++)
32             scanf("%d%d",&b[i].l,&b[i].w);
33         sort(b,b+n,cmp);
34         for(i=0;i<n;i++)
35             b[i].z=0;//均初始化为0,表示未加工过 
36         for(c=0,i=0;i<n;i++)
37         {
38             if(b[i].z==0)
39             {
40                 b[i].z=1;
41                 c++;
42                 l=b[i].l;
43                 w=b[i].w;
44                 for(j=0;j<n;j++)
45                 {
46                     if(b[j].z==0&&b[j].l>=l&&b[j].w>=w)
47                     {
48                         b[j].z=1;
49                         l=b[j].l;
50                         w=b[j].w;    
51                     }
52                 }
53             }
54         }
55         printf("%d
",c);
56     }
57     return 0;
58 }

易错分析:

注意分析题意,细心读题

测试样例:

3

5

1 1

1 1

1 2

2 1

2 2

3

3 3

3 3

2 2

3

1 2

1 1 

2  2

样例输出:

1

1

原文地址:https://www.cnblogs.com/wenzhixin/p/7225081.html