贪心:火烧赤壁
题目:P1496 火烧赤壁 - 洛谷
注意点1:
记得先a[1]的值初始化,再循环。
易错点2:
如果区间重复,记得更新右端点的值。可能原来的区间的右端点更大,也有可能合并的区间的右端点更大。我们使用一个max,保留最大的那一个。
易错点3:
最后一次循环会直接断掉,我们不要忘记手动加上最后一段合并区间的长度!
代码:
#include <iostream>
#include <algorithm>using namespace std;
typedef long long LL;
const int N = 2e4 + 10;LL n;struct node
{LL l;LL r;
}a[N];bool cmp(node& x, node& y)
{return x.l < y.l;
}LL ret = 0;int main()
{cin >> n;for (int i = 1; i <= n; i++) cin >> a[i].l >> a[i].r;sort(a+1, a+1+n, cmp);LL begin = a[1].l;LL right = a[1].r;for (int i = 2; i <= n; i++){if (right >= a[i].l) {right = max(right, a[i].r);continue;} else{ret += a[i-1].r-begin;begin = a[i].l;right = a[i].r;}}ret += right - begin; // 加上最后一个合并区间的长度cout << ret << endl;return 0;
}
记得多画图