ACM Wooden Stricks

有一堆n根木棍。每根棍子的长度和重量是预先知道的。 这些棒子将被木工机器逐一加工。。它需要一些时间,称为安装时间,用于机器准备加工棒。设置时间与机器中的清洁操作和更换工具和形状相关联。木工机械的安装时间如下:

(a)第一个木棒的设置时间是1分钟。

(b)在处理一根长度l和重量w后,如果l < = l '和w < = w ',机器将不需要安装长度l '和weight w '。否则,安装需要1分钟。

你要找到最小的安装时间来处理一堆n个木棒。例如,如果你有五根长度和重量为(4、9)、(5、2)、(2、1)、(3、5)、(1、4),那么最小设置时间应为2分钟,因为有一对(1,4),(3,5),(3,5),(4,9),(2,1),(2,1),(5,2)。

输入由T测试用例组成。在输入文件的第一行中给出了测试用例(T)的数量。每个测试用例由两行组成:第一行有一个整数n,1 < = n < = 5000,表示测试用例中木棒的数量,第二行包含n* 2个正整数l1,w1,l2,w2,…,ln,wn,最大10000点,li和wi分别是i th木棒的长度和重量。2n个整数被一个或多个空格分隔。

输出应在分钟内包含最小设置时间,每行一个。


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

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct node{
 4     int l;
 5     int w;
 6     bool flag;
 7 }sticks[5005];
 8 bool cmp(node a,node b)
 9 {
10     if(a.l!=b.l)
11         return a.l > b.l;
12     else
13         return a.w > b.w;
14 }
15 int main()
16 {
17     int t,n;
18     while(cin>>t)
19     {
20         while(t--)
21         {
22             scanf("%d",&n);
23             for(int i = 0; i < n; i++)
24             {
25                  scanf("%d %d",&sticks[i].l,&sticks[i].w);
26                     sticks[i].flag = false;
27             }
28 
29              sort(sticks,sticks+n,cmp);
30             
31             int ans = 0,min;
32             for(int i = 0; i < n; i++)
33             {
34                 if(sticks[i].flag) continue;  /*说明sticks[i]已经被处理*/
35                   min = sticks[i].w;
36                  
37                 for(int j = i+1; j < n; j++) /*往后找 l已经排好了序*/ 
38                 {
39                     if(min >=sticks[j].w && !sticks[j].flag) /*满足提议所给条件*/ 
40                     {
41                         min = sticks[j].w; /*按照题中条件 min此时应该要设为木块j的重量*/ 
42                         sticks[j].flag = true;
43                     }
44                 }
45                 ans++;
46             } 
47             cout<<ans<<endl;
48         }
49     }
50     return 0;
51 }

 

posted @ 2017-08-24 07:59  听说这是最长的名字了  阅读(362)  评论(0编辑  收藏  举报