一开始算法就错了
错误地认为是 先找到一个max连续k区间 再找一个即可。。。。(这也太简单了吧)
实际是 要找到两个连续k区间的和最大。。两者是不同的。。。。让我发现区别的样例是这个
10 4
38 11 48 90 87 4 90 82 9 85
答案应该是 除去38 和4 之外的数只和
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <list>
#include <fstream>
#include <vector>
using namespace std;
__int64 tm[2*100000+5];
__int64 big(__int64 a,__int64 b)
{
if (a<b)
return b;
return a;
}
int main()
{
__int64 n,k;
scanf("%I64d %I64d",&n,&k);
__int64 tmp;
tm[0]=0;
__int64 i;
for (i=1;i<=n;i++)
{
scanf("%I64d",&tmp);
tm[i]+=tm[i-1]+tmp;
}
if (n<=2*k)
{
printf("%I64d\n",tm[n]);
return 0;
}
__int64 ans=tm[2*k];
__int64 max=tm[k];
for (i=k+1;i<=n-k;i++)
{
max=big(max,tm[i]-tm[i-k]);
ans=big(ans,tm[i+k]-tm[i]+max);
}
printf("%I64d\n",ans);
return 0;
}