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;
}
posted @ 2011-07-18 17:09  书山有路,学海无涯  阅读(600)  评论(0编辑  收藏  举报