题目描述
C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?
输入
第一行是一个整数T(1<T<1500),表示输入数据一共有T组。
每组测试数据的第一行是一个整数N(1<=N<=5000),表示有N个木棒。接下来的一行分别输入N个木棒的L,W(0 < L ,W <= 10000),用一个空格隔开,分别表示木棒的长度和质量。
每组测试数据的第一行是一个整数N(1<=N<=5000),表示有N个木棒。接下来的一行分别输入N个木棒的L,W(0 < L ,W <= 10000),用一个空格隔开,分别表示木棒的长度和质量。
输出
处理这些木棒的最短时间。
样例输入
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
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 struct P { 6 int L; 7 int W; 8 int flag; 9 }P[5050]; 10 11 int cmp(const void *a, const void *b) { 12 struct P *c = (struct P *)a; 13 struct P *d = (struct P *)b; 14 if(c->L != d->L){ 15 return c->L - d->L; 16 } 17 return c->W- d->W; 18 } 19 20 int main( ) { 21 int T, N, i, j, now; 22 int ans; 23 scanf("%d",&T); 24 while(T--) { 25 scanf("%d",&N); 26 memset(P, 0, sizeof(P)); 27 for(i = 0; i < N; i++) { 28 scanf("%d %d", &P[i].L, &P[i].W); 29 P[i].flag = 0; 30 } 31 32 qsort(P, N, sizeof(P[0]), cmp); 33 ans = 0; 34 for(i = now = 0;i < N;i++) { 35 if(P[i].flag == 0) { 36 now = i; 37 for(j = i + 1; j < N; j++) { 38 if(P[j].flag == 0 && P[j].L >= P[now].L && P[j].W >= P[now].W){ 39 P[j].flag = 1; 40 now = j; 41 } 42 } 43 ans++; 44 } 45 } 46 printf("%d\n", ans); 47 } 48 return 0; 49 }