hud 1051 Wooden Sticks
#include<stdio.h> #include<iostream> #include<cstdlib> using namespace std; struct st { int l; int r; } a[5003]; int visit[5002]; int cmp(const void *a,const void *b) { struct st *p=(st*)a; struct st *q=(st*)b; if(p->l!=q->l) return p->l-q->l; else return p->r-q->r; } int main() { int i,j,n,t,temp,num; while(scanf("%d",&t)>0) { while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d%d",&a[i].l,&a[i].r); qsort(a,n+1,sizeof(a[1]),cmp); for(i=1;i<=n;i++) visit[i]=0; for(i=1,num=0;i<=n;i++) if(visit[i]==0) { num++; temp=a[i].r; for(j=i+1;j<=n;j++) if(visit[j]==0&&temp<=a[j].r) { visit[j]=1; temp=a[j].r; } } printf("%d\n",num); } } return 0; }
http://acm.hdu.edu.cn/showproblem.php?pid=1051
特殊的例子
5
1 3
1 5
1 2
1 1
1 9
1
看到了这个题想起了hdu的这个题
http://acm.nyist.net/JudgeOnline/problem.php?pid=236
用上面的代码超时,~_~。把while(scanf("%d",&t)>0) 改成scanf("%d",&t);过了。汗。。。
需要二级排序,看了以前写的代码,用了一级排序,过了,这组数据不对。后来用才知道用二级。又汗,以前居然过了。~
有个问题值得思考一下,
当经过二级排序后
a[i].r的值分别是 1 9 2 3 4
是1 9 和2 3 4 呢,还是1 2 3 4和9 ?
如果按照上面的方法用贪心,那就是 1 9 和2 3 4两组,但是如果用最长递增那就是 1 2 3 4 和9 了,结果对么?
嘿嘿。