Dreaming
时间限制(普通/Java):4000MS/12000MS 运行内存限制:16384KByte
比赛描述
BJ梦到自己被n个妹子围住,每个妹子对他有个好感度ai,他对这些妹子的吸引力被定义为位置连续的妹子对他好感度和的最大值,现在他想知道自己的吸引力是多少。
输入
第一行为一个数字T代表数据组数,每组数据的第一行为一个数字n表示妹子个数,下一行包含n个数,代表第i个妹子对他的好感度。
(1 <= T <= 5,1 <= n <= 2*106,|ai| <= 108,1 <= i <= n)
输出
每组数据输出一个数,代表BJ对该组妹子的吸引力。
样例输入
3
1
100000000
2
-1 1000
7
-1 1 -2 2 3 -1 5
样例输出
100000000
1000
9
提示
因为他被围住,所以a1和an位置上是相邻的。
连续的妹子数至少为1
输出用scanf, 输出用printf
题目分析:就是环形最大连续和,求一遍最大连续和x,再求一遍最小连续和y,设总和为sum,那么答案就是max(x, sum - y)
#include <cstdio>
#define ll long long
int const INF = 2147483647;
int main()
{
int T, n;
scanf("%d", &T);
while(T --)
{
scanf("%d", &n);
ll val, ma = -INF, curma = 0, sum = 0, mi = INF, curmi = 0, tmp = -INF;
bool f = false;
for(int i = 0; i < n; i++)
{
scanf("%I64d", &val);
if(val >= 0)
f = true;
if(tmp < val)
tmp = val;
sum += val;
curma += val;
if(curma > ma)
ma = curma;
if(curma < 0)
curma = 0;
curmi += val;
if(curmi < mi)
mi = curmi;
if(curmi > 0)
curmi = 0;
}
if(f)
printf("%I64d\n", ma > sum - mi ? ma : sum - mi);
else
printf("%I64d\n", tmp);
}
}