题目描述:
迪宝宝非常喜欢吃草莓,他今天来到一家草莓种植园准备采摘一部分的草莓回去。我们把草莓种植园看成一条x坐标轴,坐标轴上的部分坐标分布着若干数量的草莓。迪宝宝可以选择向左或者向右移动一个坐标,如果当前坐标上有草莓,迪宝宝可以将当前坐标上的所有草莓采摘。现在给你草莓种植园的所有草莓的分布坐标、迪宝宝的初始坐标以及迪宝宝最多可以移动的次数,请你计算一下,迪宝宝最多可以采摘多少草莓?
输入描述:
测试样例由多组测试数据组成。对于每组测试数据,第一行输入三个整数N(1 <= N <= 100000),index(0 <= index <= 200000),K(0 <= k <= 200000),分别代表草莓种植圆有N个坐标有草莓,迪宝宝的初始坐标和他最多移动的次数。接下来N行,每行输入两个整数『posi(0 <= posi <= 200000),sumi(1 <= sumi <= 10000)』,分别代表在坐标posi处有草莓sumi个(N行数据基于posi递增,保证每个posi都不相同)
输出描述:
对于每组测试样例,输出迪宝宝最多能采摘的草莓数量。
样例输入: 3 5 4 2 8 6 3 8 6 样例输出 : 9
样例输入:6 5 4 0 9 4 1 5 7 6 2 7 4 10 9 样例输出 :14
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
long long x[maxn],num[maxn];
int main(){
int n,m,k;
while(cin>>n>>m>>k){
for(int i=1;i<=n;i++){
cin>>x[i]>>num[i];
num[i]+=num[i-1];
}
long long maxx=0;
for(int i=1;i<=n;i++){
int sum=abs(m-x[i]);
if(sum<=k&&x[i]<=m){//左边走两次 右边走一边
int wz=upper_bound(x+1,x+n+1,m+max(0,k-2*sum))-x-1;//选取左边可选择的最大位置
maxx=max(maxx,num[wz]-num[i-1]);
}else if(sum<=k&&x[i]>=m){//右边走两次 左边走一边
int wz=lower_bound(x+1,x+n+1,m-max(0,k-2*sum))-x;//选取右边可选择的最大位置
maxx=max(maxx,num[i]-num[wz-1]);
}
}
cout<<maxx<<endl;
}
return 0;
}