HPU1270: Wooden Sticks

来源:互联网 发布:双源abo乐乎 编辑:程序博客网 时间:2024/06/04 00:58


1270: Wooden Sticks [贪心]

时间限制: 1 Sec 内存限制: 128 MB

提交: 33 解决: 13 统计

题目描述

Lialosiu要制作木棍,给n根作为原料的木棍的长度和重量。根据要求求出制作木棍的最短时间。

首先我们知道制作第一个木棍需要1分钟,若是接着要制作的木棍的重量和长度都不少于当前的木棍,那么就不需要建立的时间,若是没有,则再需要建立时间,也就是1分钟。

举个例子,如果你有五个原料木棍,他们的长度和重量分别是(4,9), (5,2), (2,1), (3,5), 和 (1,4), 那么第一分钟你要建立一根木棍作为起始参照,比如(1,4)接下来(3,5)和(4,9)都可以不花费时间,然后用第二分钟选取(2,1)这跟木棍作为参照,接下来(5,2)可以不花费任何时间,总的来说,你一共花费了两分钟,这也是你可能使用的最少时间。

现在给了n个木棍的长度和重量,你能求出使用这些木棍的最少时间吗?

输入

首先,输入一个正整数T ,代表有T组数据。

接下来,第二行你要输入正整数n(1<=n<=5000)代表的你的原料木棍个数。

第三行你要输入2*n 个 正整数l1, w1, l2, w2, ..., ln, wn,每一个数字都不超过10000 。 li代表第i根木棍的长度,wi代表第i根木棍的重量。

输出

输出一个整数,代表最少需要的时间t。

样例输入

354 9 5 2 2 1 3 5 1 432 2 1 1 2 231 3 2 2 3 1

样例输出

213

#include<iostream>#include<algorithm>#include<cstring>using namespace std;struct stu{int l1,w1,x;}arr[5010];bool cmp(stu x,stu y){if(x.l1==y.l1)return x.w1<y.w1;return x.l1<y.l1; }int main(){int T,n,t,a,b;cin>>T;while(T--){cin>>n;t=0;memset(arr,0,sizeof(arr));for(int i=0;i<n;i++)cin>>arr[i].l1>>arr[i].w1;sort(arr,arr+n,cmp);for(int i=0;i<n;i++){if(arr[i].x==0){t++;a=arr[i].l1;b=arr[i].w1;arr[i].x=1;for(int j=i+1;j<n;j++){if(arr[j].x==0)if(arr[j].l1>=a&&arr[j].w1>=b){arr[j].x=1;a=arr[j].l1;b=arr[j].w1;}}}}cout<<t<<endl;}}