草莓采摘大师

题目描述:

迪宝宝非常喜欢吃草莓,他今天来到一家草莓种植园准备采摘一部分的草莓回去。我们把草莓种植园看成一条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;
} 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值