#include <bits/stdc++.h>
using namespace std;
struct st {
int n,m,k;
} p[500005];
bool cmp(st x,st y) {
return x.m<y.m;
}
int a, b, s[500005] = {}, ans;
int main() {
cin>>b;
for (int i = 1; i <= b; i++) {
cin>>p[i].n>>p[i].m;
p[i].n=p[i].n-p[i].m;
p[i].m=p[i].n+2*p[i].m;
p[i].n=max(p[i].n,0);
p[i].k=1;
}
sort(p+1,p+b+1,cmp);
for (int i = 1; i <= b; i++) {
for (int j = p[i].n; j <= p[i].m; j++) {
if (p[i].k == 0) {
break;
}
if (s[j] == 1) {
p[i].k--;
}
}
for (int j = p[i].m; j >= p[i].n; j--) {
if (p[i].k == 0) {
break;
}
if (s[j] == 0) {
p[i].k--;
s[j] = 1;
ans++;
}
}
}
cout<<ans;
return 0;
}
/*题目描述
为倡导城市低碳生活,市文明办计划举办马拉松比赛,为确保比赛安全,沿途设置了一些观察点。每个观察点派一个观察员驻守。由于天气比较炎热,需要在沿途安装一些饮水机,使得观察员可以去取水喝。由于观察员每移动一个单位的路程,需要耗费一个单位的体力。而每个观察员的体力有限,只能在他体力能支持的范围内去取水喝,要不他就会渴死或累死。
聪明的楠楠也参与了这次比赛的筹备工作。他的任务是设计一个理想的安装饮水机方案,使得安装的饮水机最少,但又保证所有观察员都能取到水喝。
输入格式
输入数据有若干行。
第一行,仅一个整数,表示有N个观察点。
接下来有N行,每行两个整数Si和Wi,其中表示每个观察点到起点的路程,表示该观察点中驻点观察员的体力。
输出格式
输出最少要安装几台饮水机。
样例
样例输入
4
6 3
12 2
1 5
14 5
样例输出
2
*/
他可以将饮水机安装在距离起点为6和12的位置上,这样所有的观察员都能喝到水。方案有多种,只需输出最少需要几台饮水机即可。
先把每个观察员能走到的左右端点求出来,然后按右端点从小到大排序(这么用了贪心,你小的设了饮水机,那么大的就有可能就用这个饮水机,相反,你在大的右端点放饮水机,那么小的就要再放一个饮水机)。。。
然后用树状数组看左端点到右端点这段范围内是否有饮水机。。
一些循环和判断,程序不难看懂的
这是一个多维数组的遍历求值,可以打断点跑一跑。
看起来像是矩阵运算