AcWing 782. 避嫌抢劫
原题链接
中等
作者:
繁花似锦
,
2020-02-01 18:18:55
,
所有人可见
,
阅读 655
双指针算法(思想,优化循环):i
在前面走,j
在后面追,i,j
各走一遍n
坑:如果最后一个银行和第一个银行才>=d,那么之前不取max
#include <iostream>
#include <cstdio>
#include <algorithm>
#define x first
#define y second
using namespace std;
const int N = 200010;
typedef pair<int,int> PII;
int n,d;
PII a[N];
int main()
{
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
sort(a+1,a+1+n);
int res=0;
int maxv=a[1].y;
for(int i=1,j=1;i<=n;i++ )
{
while(j<i && a[i].x - a[j].x >= d){
maxv=max(maxv,a[j].y);
j++;
}
if(a[i].x-a[1].x<d) continue; // 最后一个数据特判,如果最后一个银行和第一个银行才>=d, 那么不加这中间的
else res=max(res,a[i].y+maxv);
}
printf("%d\n",res);
return 0;
}