问题 H: 木棒
时间限制: 1 Sec 内存限制: 32 MB
提交: 36 解决: 9
[提交][状态][讨论版]
题目描述
现有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)。
输入
输入包含多组测试数据。输入的第一行是一个整数T,表示测试数据的个数。
每个测试例两行:
第一行是一个整数n(1<=n<=5000),表示有多少根木棒;
第二行包括n*2个整数,表示了l1,w1,l2,w2,l3,w3,...,ln,wn,这些数均不大于10000,其中li和wi表示第i根木棒的长度和重量。
输出
输出以分钟为单位的最少准备时间。
样例输入
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
题意概括:
在制作一根木棍需一分钟的准备时间,如果有一根木棍的长度和重量同时都大于等于正在制作的木根时则不需要准备时间。
解题分析:
首先按木棍的长度排序,如果在做a木棍时有多根木棍的长度好和重量都符合不需要准备的条件,那么a木棍只可以使一根木棍不需要准备时间,然后用那根符合条件的木棍再去与后面的比较,同时用过的木棍不可以再次用。
测试样例:
5
3
1 2 3 3 1 2
1
1 1
2
1 1 1 1
4
5 6 9 8 9 9 8 8
3
6 5 9 8 2 0
测试样例输出:
1
1
1
1
1
代码:
#include<stdio.h> #include<algorithm> using namespace std; struct STU{ int w,l,k; }stu[5005]; int cmp(STU a, STU b) { if(a.l == b.l) return a.w < b.w; return a.l < b.l; } int main() { int n, i, T, j, h; STU a; while(scanf("%d", &T) != EOF){ while(T--){ scanf("%d", &n); h = n; for(i = 0; i < n; i++){ scanf("%d%d", &stu[i].l, &stu[i].w); stu[i].k = 1; } sort(stu, stu+n, cmp); for(i = 0; i < n-1; i++){ if(!stu[i].k) continue; stu[i].k = 0; a.l = stu[i].l; a.w = stu[i].w; a.k = stu[i].k; for(j = i+1; j < n; j++){ if(stu[j].k && stu[j].l >= a.l && stu[j].w >= a.w){ stu[j]. k = 0; a.l = stu[j].l; a.w = stu[j].w; a.k = stu[j].k; h--; } } } printf("%d\n", h); } } return 0; }