BestCoder Round #64 (div.2) HDOJ5586 Sum(脑洞)

来源:互联网 发布:seo职位 编辑:程序博客网 时间:2024/06/11 08:00

Sum

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


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
210000 999951 9999 1 9999 1
 

Sample Output
1999922033
 



题目链接:点击打开链接

定义一个b数组存储f(a[i]) - a[i]结果, 求出最大连续和即可知道n个数最大的和.

AC代码:

#include "iostream"#include "cstdio"#include "cstring"#include "algorithm"#include "queue"#include "stack"#include "cmath"#include "utility"#include "map"#include "set"#include "vector"#include "list"using namespace std;typedef long long ll;const int MOD = 10007;const int INF = 0x3f3f3f3f;const int MAXN = 1e5 + 5;int n;ll a[MAXN], b[MAXN];ll f(ll x){    return (1890 * x + 143) % MOD;}int main(int argc, char const *argv[]){    while(scanf("%d", &n) != EOF) {        ll sum = 0, x = 0, y = 0;        for(int i = 0; i < n; ++i) {            scanf("%lld", &a[i]);            b[i] = f(a[i]) - a[i];            sum += a[i];        }        for(int i = 0; i < n; ++i) {            if(x + b[i] > 0) x += b[i];            else x = 0;            if(x > y) y = x;        }        printf("%lld\n", sum + y);    }    return 0;}


1 0
原创粉丝点击