《黑书》uva10020最少区间覆盖(贪心)
题意:有n段区间,用这n段区间去覆盖区间为0~~m的区间,求最少的区间段数。
思路:把区间记为【xi,yi】;那么思考,只要按照xi从小到达排序,如果第一个区间起点不包含0就是无解的,否则则选择包含起点的最长区间,选择完后,新的起点就是yi了,在选择下一段区间......
代码:
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct ss { int x,y; }s[100000]; int cmp(const ss a,const ss b) { if(a.x<b.x) return 1; else if(a.x==b.x&&a.y>b.y) return 1; else return 0; } int main() { int text,a[100000],b[100000]; scanf("%d",&text); while(text--) { int m,len=0; scanf("%d",&m); while(1) { int tmp,tmp1; scanf("%d%d",&tmp,&tmp1); if(tmp==0&&tmp1==0) break; s[len].x=tmp; s[len].y=tmp1; len++; } sort(s,s+len,cmp); int maxx=0,sum=0,pos=0; while(1) { if(pos>=m) break; maxx=0; for(int i=0;i<len;i++) if(s[i].x<=pos&&s[i].y>pos) { if(maxx<s[i].y) { maxx=s[i].y; a[sum]=s[i].x; b[sum]=s[i].y; } } if(maxx==0) { sum=0; break; } pos=maxx; sum++; } printf("%d\n",sum); for(int j=0;j<sum;j++) printf("%d %d\n",a[j],b[j]); if(text) printf("\n"); } return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。