BestCoder Round #64 (div.2) B Sum&&HDU 5586
2015-11-28 22:11
363 查看
Sum
Accepts: 322Submissions: 940
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
给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})(1≤n≤105) 第二行n个整数{A}_{1},{A}_{2}....{A}_{n}A1,A2....An.(0\leq {A}_{i}\leq {10}^{4})(0≤Ai≤104) 数据保证 \sum n\leq {10}^{6}∑n≤106.
输出描述
对于每组数据输出一行答案.
输入样例
2 10000 9999 5 1 9999 1 9999 1
输出样例
19999 22033
//跟求最大连续子序列有点类似 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define LL __int64 const LL maxm=1e6+10; LL a[maxm]; LL b[maxm]; LL f[maxm]; LL dp[maxm]; int main() { LL n; while(scanf("%I64d",&n)!=EOF) { LL sum1=0; LL star=1,end=1; for(LL i=1;i<=n;i++) { scanf("%I64d",&a[i]); f[a[i]]=(1890*a[i]+143)%10007; dp[i]=f[a[i]]-a[i]; sum1+=a[i]; } LL MAX=dp[1]; for(LL i=2;i<=n;i++) { dp[i]=max(dp[i],dp[i-1]+dp[i]); if(MAX<dp[i]) { MAX=dp[i]; } } if(MAX<0) { printf("%I64d\n",sum1); continue; } printf("%I64d\n",MAX+sum1); } return 0; }
相关文章推荐
- C/C++整数除法以及保留小数位的问题
- 2015 ACM/ICPC Asia Regional Shenyang Online C. Minimum Cut[树链剖分]
- NodeManagerMetrics上精确化Container指标监控
- 人生不是盖楼,根本就没有重来的机会
- HDOJ 5585 Numbers
- HDOJ 2841 isible Trees (容斥原理)
- Spring MVC拦截器+注解方式实现防止表单重复提交
- 已知二叉树先序中序求后序,已知后序中序求先序
- SpringMVC中自定义参数解析器及内置类型的绑定
- 多线程之:线程安全
- jquery自定义插件
- 《精通CSS》阅读备忘
- dedecms织梦获得首字母或拼音的方法,并实现文章列表按首字母归类
- CSS3的过渡属性简单实例
- SlidingMenu
- 关于ORA-00979 不是 GROUP BY 表达式错误的解释
- 第五、六章:图像&链接
- java中String new和直接赋值的区别
- Vc中结构体小计
- Best Time to Buy and Sell Stock IV