信息学奥赛一本通 贪心算法
【题目描述】
在一个数轴上有n条线段,现选取其中k条线段使得这k条线段两两没有重合部分,问最大的k为多少?
【输入】
第一行为一个正整数n,下面n行每行2个数字ai,bi描述每条线段。
【输出】
输出文件仅包括1个整数,为k𝑘的最大值。
【输入样例】
3
0 2
2 4
1 3
【输出样例】
2
【提示】
【数据规模】
对于20%的数据,n≤10。
对于50%的数据,n≤1000。
对于70%的数据,n≤100000。
对于20%的数据,n≤1000000,0≤ai<bi≤1000000。
【分析】
两两没有重合,首先想到的是要把线段排序,那么是按左端还是右端呢?样例的数据看不出来,现补充一个样例数据,就能明显看出来了。
4
0 2
2 5
1 3
4 5
3 4
按照左端升序,选了0-2后,只能选2-5,结果k为2。如果按照右端升序,选0-2,3-4,4-5,结果k为3。所以线段排序需要按照右端升序。
【完整代码】
#include <bits/stdc++.h>
struct Node{
int x,y;
}a[1000005];
bool comp(Node x, Node y){
return x.y < y.y;
}
using namespace std;
int main(int argc, char *argv[]) {
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> a[i].x >> a[i].y;
}
//线段右端升序
sort(a,a+n,comp);
// for(int i = 0; i < n; i++){
// cout << a[i].x << " "<< a[i].y << endl;
// }
int ans = 0, right = 0;
//线段左端点大于等于前一条右端点
for(int i = 0; i < n; i++){
if(a[i].x >= right){
ans++;
right = a[i].y;
}
}
cout << ans;
return 0;
}