试题 算法提高 长度统计
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
给出n个线段以及它们的左端点和右端点。我们要求得到这些线段覆盖部分的长度。如线段[1,2]和[2,3]覆盖了数轴上1到3这个部分,所以它们覆盖的长度就是2。
输入格式
第一行一个数n表示有n条线段,之后的n行每行两个整数表示每个线段的左端点和右端点。
输出格式
一个数表示覆盖部分的长度。
样例输入
3
1 2
2 3
4 5
样例输出
3
数据规模和约定
0<n<=1000, 答案不超过32位整数。
算法:
贪心+自定义排序
代码:
#include<bits/stdc++.h>
using namespace std;
struct op {
bool operator()(vector<int> a, vector<int> b) {
return a[0] < b[0];
}
};
int main() {
int n;
cin >> n;
vector<vector<int> > arr(n, vector<int>(2));
for (int i = 0; i < n; i++) {
cin >> arr[i][0] >> arr[i][1];
}
sort(arr.begin(), arr.end(), op());
int ans = 0, nowlen = 0, l = 0, r = 0;
for (int i = 0; i < n; i++) {
int x = arr[i][0], y = arr[i][1];
if (nowlen==0 || x > r) {
ans += nowlen;
l = x;
r = y;
nowlen = y - x;
}
else {
r = max(r, y);
nowlen = max(nowlen, r - l);
}
}
ans += nowlen;
cout << ans;
return 0;
}