Sum
Accepts: 322
Submissions: 940
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
给n个数A1,A2....An,你可以选择一个区间(也可以不选),区间里每个数x变成f(x),其中f(x)=(1890x+143)mod10007。问最后n个数之和最大可能为多少。
输入描述
输入有多组数据。 每组数据第一行包含一个整数n.(1≤n≤105) 第二行n个整数A1,A2....An.(0≤Ai≤104) 数据保证 ∑n≤106.
输出描述
对于每组数据输出一行答案.
输入样例
2 10000 9999 5 1 9999 1 9999 1
输出样例
19999 22033
思路:
这题这的是没想到思路,知道是用最大子序列来做却毫无头绪,最后看了题解说要用两个之差来做,好题,脑洞大开。
这题首先求出f(x)-x的差值,说明在这个点上是增加了还是减少了,之后再找一个最大的连续子串,还有就是最小必然是x的和。
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<cmath> #include<queue> #include<vector> typedef long long ll; using namespace std; #define T 100005 #define inf 0x3f3f3f3f #define mod 10007 int f(int x) { int t = (1890*x+143)%mod; return t; } int a[T],b[T]; int main() { #ifdef zsc freopen("input.txt","r",stdin); #endif int n,m,i; while(~scanf("%d",&n)) { int sum = 0; for(i=0;i<n;++i){ scanf("%d",&a[i]); sum += a[i]; a[i] = f(a[i])-a[i]; } int ma = 0; for(i=0,m=0;i<n;++i){ if(m+a[i]>=0){ m+=a[i]; ma = max(m,ma); } else { m = 0; } } printf("%d\n",sum+ma); } return 0; }