郑轻新生周赛(7)


刚开始签到题害怕数据没有优化会超时而不敢写,最后证明自己的方法可以过去,所以要勇敢点,交一交代码。

在写神机1e7这道题的时候,自己的审题不对,导致浪费很多时间还没ac。一定要好好审题审题审题审题啊啊啊啊啊

在写猫猫吃金币这道题的时候,没有想到维护sum最大值,如果sum小于0了,就让sum=0,重新开始(新思路,值得注意)

题目描述

地面上有排成一条直线的n个金币,金币有不同的价值(甚至是负的),大嘴猫想用它的大嘴来吃这些金币。但是大嘴猫只能张一次嘴,所以它只能吃连续一段的金币。你知道大嘴猫最多能吃多大价值的金币吗?

输入

第一行一个整数n,表示有n个金币 。1 <= n <= 1000000。

接下来n行每行一个整数x,表示金币的价值。x在int范围内。

输出

一行一个整数,表示最多吃下金币的价值。

样例输入
4
1 2 -1 10
样例输出 12
  从前往后累加,同时维护最?值。因为要取sum最?的?段,所以sum?于0时让sum=0。 不用算出前缀和,然后for套for求区间内前缀和,这样太麻烦了,会超时!
#include 
using namespace std;


int main()
{
    int n;
    cin>>n;
    long long sum=0,m=0;        //为了防止数太大,所以开longlong 
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        if(sum+x<0)sum=0;
        else sum=max(sum,sum+x);
    }
    
    cout<endl;
    
    return 0;
}