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).
 
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)。
 
简单的贪心,只需要不停的扫描这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
",ans);
53     }
54     return 0;
55 }
View Code
原文地址:https://www.cnblogs.com/to-creat/p/4933544.html