【HDU5586 BestCoder Round 64 (div1)A】【贪心 最大连续子串】Sum 区间函数值变换使得数列权值和最大

来源:互联网 发布:彩虹六号排位怎么算法 编辑:程序博客网 时间:2024/04/30 22:08
#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|1typedef 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[N];int b[N];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)*/

0 0
原创粉丝点击