老规矩 先读题
开拓小队决定从地球出发在银河中选择一些星球收集星琼,银河可以简单视为一条从地球出发的数轴轨道,总共有光年长,在这
光年的长度中分布着
个星球,第
个星球在距离地球
光年的位置,到达这个星球可以采集
个星琼,但是每行进一光年会消耗1星琼。为了让开拓小队采集的星琼尽可能多,他们提前在地球与轨道末端之间添加了传送门,可以在两端任意传送。请问开拓小队从地球出发最终回到地球,在整个过程中最多获取了多少星琼?
输入格式
第一行两个整数、
接下来的N行分别表示、
对于
%的数据,
输入中的所有值都是整教。
输出格式
过程中最多获得的星琼
样例输入
3 30
1 80
15 1
29 80
样例输出
157
提示
样例一:先走到第一颗星球,再回到地球,再坐传送门到达轨道末端,然后到第二颗星球,回到轨道末端,传送回地球,最终剩余156星琼,过程中最多获取了157星琼。
首先,我一看到这题,就想到了贪心
,
肯定要用结构体存,毕竟他们是同一星球上的量,后续排序要用到
每走一步都对结构体排序
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
看在我这么努力的份上,点个赞再走吧