题目描述
数轴上有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; }