【HDU5586 BestCoder Round 64 (div1)A】【贪心 最大连续子串】Sum 区间函数值变换使得数列权值和最大
2015-11-29 19:04
447 查看
#include<stdio.h> #include<string.h> #include<ctype.h> #include<math.h> #include<iostream> #include<string> #include<set> #include<map> #include<vector> #include<queue> #include<bitset> #include<algorithm> #include<time.h> using namespace std; void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);} #define MS(x,y) memset(x,y,sizeof(x)) #define MC(x,y) memcpy(x,y,sizeof(x)) #define MP(x,y) make_pair(x,y) #define ls o<<1 #define rs o<<1|1 typedef long long LL; typedef unsigned long long UL; typedef unsigned int UI; template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;} template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;} const int N=1e5+10,M=0,Z=1e9+7,ms63=1061109567; int casenum,casei; int a ; int b ; int n,x; inline int f(int x) { return (1890*x+143)%10007; } int main() { while(~scanf("%d",&n)) { int sum=0; for(int i=1;i<=n;++i) { scanf("%d",&x); sum+=x; a[i]=f(x)-x; } int maxv=0; int tmp=0; for(int i=1;i<=n;++i) { tmp+=a[i]; if(tmp<0)tmp=0; gmax(maxv,tmp); } printf("%d\n",sum+maxv); } return 0; } /* 【题意】 给你一个长度为n(1e5)的数串, 我们可以把一个区间段的数由x变成f(x), 让你选择一个区间段做变换或不变换,使得这个数列之和尽可能大,并输出 【类型】 贪心 最大连续子串。 【分析】 我们要选择怎么样的一个区间段做变换呢? 我们考虑变前与变后的差异,存在a[]中,然后求出一个最大连续子序列。 如果变换,肯定是这个区间段做变换,于是更新输出答案即可。 【时间复杂度&&优化】 O(n) */
相关文章推荐
- 1.一些 贪心算法 的简单思维题:
- 贪心算法——字典序最小问题
- 贪心算法——区间调度问题
- Jump Game I,II 贪心
- Wildcard Matching
- 贪心法实现无向图的划分 代码
- 贪心题目循环和控制台折行
- HDOJ 1009
- 【解题报告】【USACO】酸奶工厂
- 【解题报告】【】交谊舞
- POJ 1328
- Best Cow Line
- 贪心 hdu 1003
- 最大容器
- 满足和为定值的两个数或多个数
- Codeforces Round #300
- HUD1052 __ P2 1002 __ Tian Ji -- The Horse Racing
- 2015年国家集训队测试 BZOJ3816矩阵变幻
- poj 1328
- HDU--1052