返回顶部

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;
    }
    
    
posted @ 2020-11-10 10:45  Rayotaku  阅读(223)  评论(0编辑  收藏  举报