限定子段长度最短为m,,贴个我的超时代码Time Limit Exceed 哈哈
方法和 hdu1003 一样
#include<iostream>
#include<stdio.h>
using namespace std;
int num[1000001],n,m;
int getn(int x)
{
int i,ret=0;
for(i=x;i>x-m;i--) ret+=num[i];
return ret;
}
int main()
{
int now,max,i,j,temp,T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m); for(i=1;i<=m;i++) scanf("%d",&num[i]);
now=max=getn(m);
for(i=m+1;i<=n;i++)
{
scanf("%d",&num[i]);
temp=getn(i);
if(now+num[i]<temp)
now=temp;
else
now+=num[i];
if(now>max) max=now;
}
printf("%d\n",max);
}
return 0;
}
换个方法待会再来= = 贴
我回来了~。。。。。。
发现自己好懒 ,,
上面的代码优化之后是可以ac的
部分时间花费在了getn函数的循环上
所以用sum2-sum1代替getn()
恩
#include<iostream>
#include<stdio.h>
using namespace std;
int num[1000001],n,m;
int getn(int x)
{
int i,ret=0;
for(i=x;i>x-m;i--) ret+=num[i];
return ret;
}
int main()
{
int now,max,i,j,temp,T,sum1,sum2;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m); for(i=1;i<=m;i++) scanf("%d",&num[i]);
sum2=now=max=getn(m);
sum1=0;
for(i=m+1;i<=n;i++)
{
scanf("%d",&num[i]);
sum2+=num[i];
sum1+=num[i-m];
temp=sum2-sum1;
if(now+num[i]<temp)
now=temp;
else
now+=num[i];
if(now>max) max=now;
}
printf("%d\n",max);
}
return 0;
}
#include<stdio.h>
int num[100000],n,m;
int main()
{
int now,max,i,temp,T,sum1,sum2;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m); for(temp=0,i=1;i<=m;i++) {scanf("%d",&num[i]);temp+=num[i];}
sum2=now=max=temp;sum1=0;
for(i=m+1;i<=n;i++)
{
scanf("%d",&num[i]);
sum2+=num[i];
sum1+=num[i-m];
temp=sum2-sum1;
now+num[i]<temp?now=temp:now+=num[i];
max=max>now?max:now;
}
printf("%d\n",max);
}
return 0;
}