p.s. 循环中必须用scanf!cin会TLE
假·最大子段和
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
给出一个数组,数组首尾相连,询问最大连续子段和为多少。
Input
首先输入一个T表示T (1<=T<=50) 组数据,然后每组数据首先输入一个n (1<=n<=1e5) 表示有n个数字,然后输入n个数字(题目保证数字范围在 int 内),表示所求数组。
Output
数组最大的连续子段和。
Sample Input
1
7
10 -100 1 -2 -5 3 4
Sample Output
17
Hint
全是负数的时候,最大的连续子段和为 0。
题目链接:
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2736/pid/4359
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long minans=0,maxans=0,minsum=0,maxsum=0,s=0;
int n;
cin >> n;
while(n--)
{
int x;
scanf("%d",&x);
if(x+maxsum>=0)
{
maxsum=x+maxsum;
maxans=max(maxsum,maxans);
}
else
maxsum=0;
if(x+minsum<=0)
{
minsum=x+minsum;
minans=min(minsum,minans);
}
else
minsum=0;
s+=x;
}
cout << max(maxans,s-minans) << endl;
}
return 0;
}