Wooden Sticks
Problem Description
There is a pile of n wooden sticks. The length and weight of each stick are known in advance. The sticks are to be processed by a woodworking machine in one by one fashion. It needs some time, called setup time, for the machine to prepare processing a stick. The setup times are associated with cleaning operations and changing tools and shapes in the machine. The setup times of the woodworking machine are given as follows:
(a) The setup time for the first wooden stick is 1 minute.
(b) Right after processing a stick of length l and weight w , the machine will need no setup time for a stick of length l' and weight w' if l<=l' and w<=w'. Otherwise, it will need 1 minute for setup.
You are to find the minimum setup time to process a given pile of n wooden sticks. For example, if you have five sticks whose pairs of length and weight are (4,9), (5,2), (2,1), (3,5), and (1,4), then the minimum setup time should be 2 minutes since there is a sequence of pairs (1,4), (3,5), (4,9), (2,1), (5,2).
(a) The setup time for the first wooden stick is 1 minute.
(b) Right after processing a stick of length l and weight w , the machine will need no setup time for a stick of length l' and weight w' if l<=l' and w<=w'. Otherwise, it will need 1 minute for setup.
You are to find the minimum setup time to process a given pile of n wooden sticks. For example, if you have five sticks whose pairs of length and weight are (4,9), (5,2), (2,1), (3,5), and (1,4), then the minimum setup time should be 2 minutes since there is a sequence of pairs (1,4), (3,5), (4,9), (2,1), (5,2).
Input
The input consists of T test cases. The number of test cases (T) is given in the first line of the input file. Each test case consists of two lines: The first line has an integer n , 1<=n<=5000, that represents the number of wooden sticks in the test case, and the second line contains n 2 positive integers l1, w1, l2, w2, ..., ln, wn, each of magnitude at most 10000 , where li and wi are the length and weight of the i th wooden stick, respectively. The 2n integers are delimited by one or more spaces.
Output
The output should contain the minimum setup time in minutes, one per line.
Sample Input
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
Sample Output
2
1
3
翻译一下题目:
现有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)。
简单的贪心,只需要不停的扫描这n个木棍,符合条件就继续往后扫,已经比过的直接跳过,到最后没了时间就+1,然后再从头扫描,用一个cnt来计数,循环结束的条件是cnt==n。 注意一定要先排序!!
1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #include <algorithm> //sort函数所需头文件 5 using namespace std; 6 7 struct stick 8 { 9 int l,w; //长度和重量 10 int v; //用于标记木棒是否被处理 11 }s[5500]; 12 13 int cmp(const stick &a,const stick &b) 14 { 15 if(a.l==b.l) 16 return a.w<b.w; 17 return a.l<b.l; 18 } //定义排序原则 19 20 int main() 21 { 22 int i,t,k,n,cnt,ans; //cnt表示被标记元素的个数(如果元素全部被标记cnt=n说明他们都找到了其升序子序列),ans为准备时间 23 scanf("%d",&t); 24 while(t--) 25 { 26 scanf("%d",&n); 27 for(i=0;i<n;i++) 28 { 29 scanf("%d%d",&s[i].l,&s[i].w); 30 s[i].v=0; //初始标记为0 31 } 32 sort(s,s+n,cmp); 33 cnt=0; 34 k=0; 35 ans=0; 36 while(cnt!=n) 37 { 38 k=0; 39 while(k<n&&s[k].v==1) //依次遍历到上次循环找到的升序子序列 直到不满足条件的第一个元素 40 k++; 41 ans++; //准备时间要+1 42 for(i=k;i<n;i++) //找出一个从k开始的升序子序列 并标记为1 43 { 44 if(s[i].v==0&&s[i].l>=s[k].l&&s[i].w>=s[k].w) //之前找过的已经标记为1了,所以不可以再次使用 45 { 46 s[i].v=1; 47 cnt++; //记录标记元素的个数 48 k=i; //k指向当前处理的木棒 49 } 50 } 51 } 52 printf("%d\n",ans); 53 } 54 return 0; 55 }