poj 1716
题意:在几个区间里面,挑选出几个数字组成一个集合,使得每个区间都至少有两个数字在这个集合里面,求这个集合的最少数字个数。
用贪心来做,开始我是按照每个区间的左端点进行排序,感觉需要考虑多种情况,弄了很长时间没弄出来。然后我有换一种方法来做:按每个区间的右端点从小到大排序,对于每个区间,先查看该区间内有没有数字被选过,若选过则选了几个。若没有被选过则应该选该区间的最后两个数字,若选了一个则选该区间的最后一个数字。
具体代码如下:
#include<iostream> using namespace std; struct node { int x; int y; }a[10001]; int ss[10001]; int cmp(const void * a,const void * b) { return ((node*)a)->y-((node*)b)->y; } int main() { int i,j,m,n,count; while(cin>>n) { for(i=0;i<n;i++) { cin>>a[i].x>>a[i].y; } qsort(a,n,sizeof(a[0]),cmp); memset(ss,0,sizeof(ss)); count=2; ss[a[0].y]=1; ss[a[0].y-1]=1; for(i=1;i<n;i++) { m=0; for(j=a[i].x;j<=a[i].y;j++)//查看该区间有几个数字被选过 { if(ss[j]) m++; if(m>=2) break; } if(m==0)//选择后两个 { count+=2; ss[a[i].y]=1; ss[a[i].y-1]=1; } if(m==1)//选择最后一个 { count++; ss[a[i].y]=1; } } cout<<count<<endl; } return 0; }