HDU 5586 Sum (区间和最大)

来源:互联网 发布:软件标识号 编辑:程序博客网 时间:2024/05/22 07:54


问题描述
给n个数{A}_{1},{A}_{2}....{A}_{n}A1,A2....An,你可以选择一个区间(也可以不选),区间里每个数x变成f(x),其中f(x)=(1890x+143) mod 10007f(x)=(1890x+143)mod10007。问最后n个数之和最大可能为多少。
输入描述
输入有多组数据。每组数据第一行包含一个整数n.(1\leq n\leq {10}^{5})(1n105)第二行n个整数{A}_{1},{A}_{2}....{A}_{n}A1,A2....An.(0\leq {A}_{i}\leq {10}^{4})(0Ai104)数据保证 \sum n\leq {10}^{6}n106.
输出描述
对于每组数据输出一行答案.
输入样例
210000 999951 9999 1 9999 1
输出样例
1999922033

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<vector>#include<set>#include<queue>#include<stack>using namespace std;typedef long long LL;const int maxn=1e5+100;int a[maxn],b[maxn];int main(){    int n,i,j,sum;    int ans,last;    while(scanf("%d",&n)!=EOF) {        sum=0;        for(i=1;i<=n;i++) {            scanf("%d",&a[i]);            b[i]=(1890*a[i]+143)%10007-a[i];            sum+=a[i];        }        ans=0;        last=0;        for(i=1;i<=n;i++) {            last=max(0,last)+b[i];            ans=max(ans,last);        }        ans+=sum;        printf("%d\n",ans);    }    return 0;}



0 0