题目描述
C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?
输入
第一行是一个整数T(1<T<1500),表示输入数据一共有T组。 每组测试数据的第一行是一个整数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
样例输出
213
1 #include2 #include 3 #include 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 }