HDOJ 5586 Sum (最大连续子串和)

Sum

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 489    Accepted Submission(s): 275


Problem Description
There is a number sequence A1,A2....An ,you can select a interval [l,r] or not,all the numbers Ai(lir) 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. (1n105)
Next line contains n integers A1,A2....An . (0Ai104)
It's guaranteed that n106 .
 

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
 

题意:n个数的序列A,可以选择一段的Ai,使其中的Ai变为f(Ai),也可以不变(PS:原来做的时候没看到那个not,汗= =),求变化后的最大和
思路:将序列中每个数和对应的其变化过的数之差存起来,然后求得最长连续子串和 最后加上原始的序列总和


ac代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#define fab(a) (a)>0?(a):(-a)
#define LL long long
#define MAXN 100010
#define INF 0xfffffff 
using namespace std;
LL num[MAXN];
int a[MAXN];
LL ans;
int main()
{
	int i,n,j;
    while(scanf("%d",&n)!=EOF)
    {
    	ans=0;
    	for(i=1;i<=n;i++)
    	{
    		scanf("%d",&a[i]);
    		ans+=a[i];
    		num[i]=(a[i]*1890+143)%10007-a[i];
		}
		int s=0,M=0;
		for(i=1;i<=n;i++)
		{
			s+=num[i];
			if(s>0)
			M=max(M,s);
			else
			s=0;
		}
		printf("%lld\n",ans+M);
	}
    return 0;
}


你可能感兴趣的:(HDOJ 5586 Sum (最大连续子串和))