AtCoder Beginner Contest 182 D - Wandering (前缀和)
-
题意:在\(x\)轴上,你刚开始在\(0\)的位置,第\(i\)次操作需要走\(A_1,...,A_i\)个单位,如果\(A_i\)为正向右走,否则向左走,求你所能走到的最大坐标.
-
题解:我们一步一步来看:
第一次走:\(A_1\).
第二次走:\(A_1,A_2\).
.
.
.
第\(n\)次走:\(A_1,A_2,...,A_n\).
在某次刚开始走的时候,我们的贡献应该是上一次走完的贡献,分别加上\(A_1,...,A_i\),而最大值就产生在这个过程中,如果暴力遍历的话必然超时,我们可以每一步都维护一个前缀的最大值\(mx\),然后更新答案即可.
-
代码:
int n; ll a[N]; ll ans=0; int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n; for(int i=1;i<=n;++i) cin>>a[i]; ll mx=0; //前缀的最大值 ll cur=0; //当前所在坐标 ll cnt=0; //前缀的值 for(int i=1;i<=n;++i){ mx=max(mx,cur+a[i]); //更新前缀最大值 ans=max(ans,cnt+mx); //更新答案 cnt+=cur+a[i]; //更新前缀 cur+=a[i]; } cout<<ans; return 0; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮