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;

}

  

你可能感兴趣的:(OJ)