题目描述
数轴上有n条线段,选取其中k条线段使得这k条线段两两没有重合部分,问k最大为多少。
输入描述:
第一行为一个正整数n;
在接下来的n行中,每行有2个数ai,bi描述每条线段。
输出描述:
输出一个整数,为k的最大值。
思路:
这道题也算是常见的贪心中的区间问题了,我存区间中的起点与终点是喜欢使用pair关键字来存,当然也可以自己写一个类型,只是用pair类型可以直接用sort()来排序。
代码步骤:
1.输入并排序。
2.用两个变量(ans和k)都初始为0(ans是存答案,k是为了后面进行比较),在循环n遍中,如果第i个线段的起点大于或等于k,k就等于第i个线段的终点,ans++;
完整C++版AC代码
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int, int>PII;//pair的好处是可以直接用sort,不用写小于之类的
bool cmp(PII a, PII b) {
return a.second < b.second;
}
const int N = 10000100;
PII jl[N];//分别存线段的起点与终点
int n;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> jl[i].first >> jl[i].second;
}
sort(jl, jl + n, cmp);
int ans = 0, k = 0;
for (int i = 0; i < n; i++) {
if (jl[i].first >= k) {
k = jl[i].second;
ans++;
}
}
cout << ans << endl;
return 0;
}
京公网安备 11010502036488号