FOJ2013
限定子段长度最短为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; }