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;
}
浙公网安备 33010602011771号