Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 44 Accepted Submission(s): 32
Problem Description
There is a number sequence
A1,A2....An
,you can select a interval [l,r] or not,all the numbers
Ai(l≤i≤r)
will become
f(Ai)
.
f(x)=(1890x+143)mod10007
.After that,the sum of n numbers should be as much as possible.What is the maximum sum?
Input
There are multiple test cases.
First line of each case contains a single integer n. (1≤n≤105)
Next line contains n integers A1,A2....An . (0≤Ai≤104)
It's guaranteed that ∑n≤106 .
First line of each case contains a single integer n. (1≤n≤105)
Next line contains n integers A1,A2....An . (0≤Ai≤104)
It's guaranteed that ∑n≤106 .
Output
For each test case,output the answer in a line.
Sample Input
2 10000 9999 5 1 9999 1 9999 1
Sample Output
19999 22033
令Ai=f(Ai)-Ai,然后求一遍最大连续子序列和就能知道最多能增加的值。
上面是官方给出的题解, 题目和HDOJ 1003很像,1003就是一个最大连续子序列和的模板题。我没有求最大连续子序列,不过思想差不多。
代码如下:
#include<cstdio>
#include<cstring>
int a[100010];
int main()
{
int n,i,start,end,temp,max,sum,ans;
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(i=0;i<n;++i)
{
scanf("%d",&a[i]);
sum+=a[i];
}
ans=sum; max=sum;
for(i=0;i<n;++i)
{
ans=ans-a[i]+((1890*a[i]+143)%10007);
if(ans>max)
max=ans;
if(ans<sum)
ans=sum;
}
printf("%d\n",max);
}
return 0;
}