ICPC, NEERC, Southern Subregional Contest F. Ilya Muromets

//写这题的原因是:我不知道竟然还有这种解法,//首先k*2>=n肯定输出sum[n];否则,//我们从k+1开始遍历,找到k+i左边k个连续的最大值//以i为起点连续的k个值的和相加,取个最大值就是我们要的解//这题我真的是一开始没有思路,最后才知道,原来两边分开的情况//和连续的两个k是一样的。不多说了,,多练吧。。。#include <algorithm>#include <bitset>#include <cassert>#include <cctype>#include <cfloat>#include <climits>#include <cmath>#include <complex>#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>#include <deque>#include <functional>#include <iostream>#include <list>#include <map>#include <numeric>#include <queue>#include <set>#include <stack>#include <vector>#define ceil(a,b) (((a)+(b)-1)/(b))#define endl '\n'#define gcd __gcd#define highBit(x) (1ULL<<(63-__builtin_clzll(x)))#define popCount __builtin_popcountlltypedef long long ll;using namespace std;const int MOD = 1000000007;const long double PI = acos(-1.L);template<class T> inline T lcm(const T& a, const T& b) { return a/gcd(a, b)*b; }template<class T> inline T lowBit(const T& x) { return x&-x; }template<class T> inline T maximize(T& a, const T& b) { return a=a<b?b:a; }template<class T> inline T minimize(T& a, const T& b) { return a=a<b?a:b; }template<class T> inline void unify(const T& c) { c.resize(unique(c.begin(), c.end())-c.begin());}const int maxn = 2e5+10;ll a[maxn];ll sum[maxn];ll l[maxn];ll r[maxn];int n,k;int main(){freopen("G:\\Code\\1.txt","r",stdin);while(scanf("%d%d",&n,&k)!=EOF){memset(sum,0,sizeof(sum));memset(l,0,sizeof(l));memset(r,0,sizeof(r));for (int i=1;i<=n;i++)scanf("%I64d",&a[i]);//for (int i=1;i<=n;i++)//printf("%d ",a[i]);//puts("");for (int i=1;i<=n;i++)sum[i] = sum[i-1] + a[i];if (k*2>=n){printf("%lld\n",sum[n]);return 0;}ll ans = sum[2*k];ll t = sum[k];for (int i=k+1;i+k<=n;i++){t = max (t,sum[i]-sum[i-k]);ans = max(ans,t+sum[i+k]-sum[i]);}printf("%lld\n",ans);}return 0;}

己欲立先立人,已欲达先达人。

ICPC, NEERC, Southern Subregional Contest F. Ilya Muromets

相关文章:

你感兴趣的文章:

标签云: