题目描述
现有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)。
(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根木棒的长度和重量。
每个测试例两行:
第一行是一个整数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 #include2 #include 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 ) 32 scanf("%d%d",&b[i].l,&b[i].w); 33 sort(b,b+n,cmp); 34 for(i=0;i ) 35 b[i].z=0;//均初始化为0,表示未加工过 36 for(c=0,i=0;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 ) 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\n",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
样例输出:
2
1
1