郑轻新生周赛(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 <bits/stdc++.h> 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<<sum<<endl; return 0; }