上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点。但是这几天LYH太忙了,你们帮帮他吗?
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; }
原文:http://blog.csdn.net/computer_liuyun/article/details/22499055