思路
将数组处理一下,保存变化后和变化的差值。
这样的话,正数代表有益,负数代表无益,这样对整个数组进行一次遍历,就可以得到最大获益的变化。
代码
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef long long ll;
int num[1000100];
int main()
{
int n;
while(scanf("%d", &n)!=EOF)
{
ll sum = 0;
for(int i=0; i<n; i++)
{
scanf("%d", num+i);
sum += num[i];
// 处理数据
num[i] = (num[i]*1890+143)%10007 - num[i];
}
ll maxSum = 0;
ll tmp = 0;
for(int i=0; i<n; i++)
{
tmp += num[i];
if(tmp<0)
{
tmp = 0;
}
else
{
if(tmp>maxSum)
maxSum = tmp;
}
}
printf("%I64d\n", sum+maxSum);
}
return 0;
}