找点
时间限制:
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
-
多组测试数据。
解析:这道题是典型的贪心问题,不过比较简单,和前几天做的河南省六届ACM竞赛(河南省第六届程序设计竞赛--外星人的供给站)中的外星人供给站非常类似,其实就是对所有的区间进行排序,然后从最左边的值开始来判断所有的区间,一旦判断出区间的左边界大于right,则说明两个区间没有交集,则count++,如果没有超过右边界的话,则缩小当前的区间更新left 和 right。有问题或者写的不对的地方请大家批评指正哈!
#include <iostream>
#include <algorithm>
using std::endl;
using std::cout;
using std::cin;
using std::sort;
struct Point{
int a;
int b;
};
bool cmp(Point x1 , Point x2)
{
return x1.a < x2.a;
}
int main()
{
int N;
Point data[100];
while(cin >> N)
{
int count = 1;
for(int i=0; i<N; ++i)
{
//输入闭区间
cin >> data[i].a >> data[i].b;
}
//对闭区间进行排序
sort(data , data+N, cmp);
//对区间进行判断
int left = data[0].a;
int right = data[0].b;
for(int i=1; i<N; ++i)
{
//如果该区间的左边界大于前一个的右边界的话,则要取的点数就++
if(data[i].a > right)
{
count++;
left = data[i].a;
right = data[i].b;
}else{
//这个其实没必要判断
if(data[i].a > left)
{
left = data[i].a;
}
//这个右边界的需要判断一下
if(data[i].b < right)
{
right = data[i].b;
}
}
}
cout << count << endl;
}
return 0;
}