nyoj 891 找点

找点

时间限制:2000 ms  |  内存限制:65535 KB 难度:2 描述

上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点。但是这几天LYH太忙了,你们帮帮他吗?

输入多组测试数据。
每组数据先输入一个N,表示有N个闭区间(N≤100)。
接下来N行,每行输入两个数a,b(0≤a≤b≤100),表示区间的两个端点。 输出输出一个整数,表示最少需要找几个点。 样例输入

4
1 5
2 4
1 4
2 3
3
1 2
3 4
5 6
1
2 2

样例输出

1
3
1

此题为贪心区间取点问题,先将区间右端b按从小到大排序
当b相等时将a按从大到小排序,这样则小区间在大区间上边;
将第一个区间的右端b赋值给j,然后依次与以下区间的左端a比较
若大于以下区间的左端a,则证明有公共区间,当j大于后边的区间
左边a时,证明与以上区间无重合部分则 m++;左后输出m

 

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct record
{
	int beg;
	int end;
}num[101];
bool cmp(record a,record b)   //排序  将区间右边按从小到大排序 
{
	if(a.end!=b.end)
	return a.end<b.end;      //区间左边 在右边的基础上从大到小排序 
	else
	return a.beg>b.beg;
}
int main()
{
	int n,m,j,i,s,t;	
	while(scanf("%d",&n)!=EOF)
	{
		j=0;
	    for(i=0;i<n;i++)
	    scanf("%d %d",&num[i].beg,&num[i].end);
	    sort(num,num+n,cmp);
		j=num[0].end;m=1;	    
	    for(i=1;i<n;i++)       //当下一个区间的左边大于开始赋值的数 j 
	    {	                    //则将此区间 的右边赋值给j 
		    if(num[i].beg>j)
		    {
		    	j=num[i].end;     
		    	m++;
		    }
        }
        printf("%d\n",m);
    }
	return 0;
}

  

posted @ 2015-03-28 20:08  非我非非我  阅读(283)  评论(0编辑  收藏  举报