标签:
SUM
Description

















































Input




































Output
Sample Input
2 10000 9999 5 1 9999 1 9999 1
Sample Output
19999 22033
题意:
给出一个序列,允许把其中某一连续段的所有值变成这个数对应的某个函数的值,只允许操作一次,问得到的最终序列的和最大为多少
题解:
找出一个数组,储存每一个数字经过函数运算后变成的数与原来这个数的差值,,对这个数组求最大连续子序列的和,然后加上原来数组的总和即为所求
比赛的时候确实脑残了,本来自己会的知识点,就稍微转化了一下,自己竟然没分析出来,真心怀疑人生了.....
学会的东西想要达到灵活运用,真的是好难啊..
/*
http://blog.csdn.net/liuke19950717
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll maxn=1e5+5;
const ll mod=10007;
ll x[maxn],y[maxn];
ll max_sum(ll num[],ll n)
{
ll ans=0,tp=0;
for(ll i=0;i<n;++i)
{
tp+=num[i];
if(tp<0)
{
tp=0;
}
ans=max(ans,tp);
}
return ans;
}
int main()
{
ll n;
while(~scanf("%lld",&n))
{
ll ans=0;
for(ll i=0;i<n;++i)
{
scanf("%lld",&x[i]);
y[i]=(1890*x[i]+143)%mod-x[i];
ans+=x[i];
}
printf("%lld\n",ans+max_sum(y,n));
}
return 0;
}标签:
原文地址:http://blog.csdn.net/liuke19950717/article/details/51252693