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 }