NKOJ P11161 收集星琼

文章讲述了在一个包含多个星球的银河轨道中,如何利用贪心算法和正确分类方法最大化开拓小队采集星琼的过程,涉及前缀和、后缀和计算以及不同路径的综合考虑。
摘要由CSDN通过智能技术生成

老规矩  先读题

开拓小队决定从地球出发在银河中选择一些星球收集星琼,银河可以简单视为一条从地球出发的数轴轨道,总共有S光年长,在这S光年的长度中分布着N个星球,第i个星球在距离地球x_{i}光年的位置,到达这个星球可以采集y_{i}个星琼,但是每行进一光年会消耗1星琼。为了让开拓小队采集的星琼尽可能多,他们提前在地球与轨道末端之间添加了传送门,可以在两端任意传送。请问开拓小队从地球出发最终回到地球,在整个过程中最多获取了多少星琼?

输入格式

第一行两个整数NS

接下来的N行分别表示x_{i}y_{i}

对于100%的数据,

1\leq N\leq 10^{5}

2\leq S\leq 10^{14}

1\leq x_{1}< x_{2}<\cdots <x_{n}<S

1\leq y_{i}\leq10^{9}

输入中的所有值都是整教。

输出格式

过程中最多获得的星琼

样例输入

3 30
1 80
15 1
29 80

样例输出

157

提示

样例一:先走到第一颗星球,再回到地球,再坐传送门到达轨道末端,然后到第二颗星球,回到轨道末端,传送回地球,最终剩余156星琼,过程中最多获取了157星琼。

首先,我一看到这题,就想到了贪心

x_{i}y_{i}肯定要用结构体存,毕竟他们是同一星球上的量,后续排序要用到

每走一步都对结构体排序

cmp

bool cmp(node a,node b){
		return a.y-a.x<b.y-b.x;
}

一提交

爆零!

贪心改了又改,一直爆零

结果,思路错了

QwQ

正确思路:

分类讨论!!!

1 . 一直往前走,取前缀和最大值  超简单

for(int i=1; i<=n; i++){
	sum[i]=sum[i-1]+y[i]-(x[i]-x[i-1]);
	s1[i]=max(s1[i-1],sum[i]);
}

2 . 先坐电梯到终点,再往后挖,显然后缀和

for(int i=n; i>=1; i--){
	sum2[i]=sum2[i+1]+y[i]-(x[i+1]-x[i]);
	s2[i]=max(s2[i+1],sum2[i]);
}

3 . 先从前往后挖一些,再坐电梯到终点,再往前挖一些

就只需要注意前面一条路走两遍就够了

for(int i=1; i<=n; i++){
	cnt1[i]=cnt1[i-1]+y[i];
	s3[i]=max(s3[i-1],cnt1[i]-2*x[i]+s2[i+1]);
}

4 . 先从后往前挖一些,再坐电梯回起点,往后挖一些

for(int i=n; i>=1; i--){
	cnt2[i]=cnt2[i+1]+y[i];
	s4[i]=max(s4[i+1],cnt2[i]-2*(len-x[i])+s1[i-1]);
} 

取四种情况中的最大值就行了

最后,多嘴提一句

不开long long见祖宗!

我亲自帮你们踩雷QwQ

看在我这么努力的份上,点个赞再走吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值