原题链接
思路描述
将所有区间根据区间的右端点进行排序,首先,记录最开始右端点的区间值,遍历后面的区间。如果后面区间的左端点大于等于该值,那么说明可以使用一个点来表示。如果无法表示,那么就说明需要增加一个点来使其再区间的内部。
算法证明
设该算法得到的点数为res
,正确答案为ans
,下面证明$res == ans$。
证明$res \geq ans$
由于该算法肯定是正确的,而ans
又是最小值,因此该不等式肯定成立。
证明$res\leq ans$
在上述算法中,每次新记录一个右端点值的所有区间,实际上就是没有任意交集的区间,它们的个数正好是res
。根据题目要求的描述,如果有res
个没有交集的区间,那么至少就有res
个点,因此有$res\leq ans$
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <bits/stdc++.h> using namespace std; vector<pair<int,int>> v; int n, res, r; int main() { scanf("%d", &n); while(n--) { int a, b; scanf("%d%d", &a, &b); v.push_back(make_pair(b, a)); } sort(v.begin(), v.end()); r = -1000000001; for(auto ele : v) { int b = ele.first, a = ele.second; if(a > r) { res++; r = b; } } printf("%d", res); return 0; }
|