题目描述
⑨有一本书,上面有很多有趣的OI问题。今天⑨看到了这么一道题目:
这里有一个长度为n的正整数数列ai(下标为1~n)。并且有一个参数k。
你需要找两个正整数x,y,使得x+k<=y,并且y+k-1<=n。并且要求ax+ax+1+…+ax+k-1+ay+ay+1+…+ay+k-1最大。
⑨并不会做,于是她把题扔给了你。
输入格式(max.in)
第一行两个数n,k。
第二行n个数,表示ai。
输出格式(max.out)
两个数表示x,y。若有很多种满足要求的答案,输出x最小的值,若x最小仍然还有很多种满足要求的答案,输出y最小的值。
老师放的正解在这里↓
1 #include <cmath> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 int n,m,a[200005],i,ansx,ansy; 8 long long sum[200005],MAX,MAX1[200005],MAX2[200005],x2[200005],x1[200005]; 9 int main() 10 { 11 freopen("max.in","r",stdin); 12 freopen("max.out","w",stdout); 13 scanf("%d%d",&n,&m); 14 for (i=1; i<=n; i++) scanf("%d",&a[i]); 15 for (i=1; i<=n; i++) 16 sum[i]=sum[i-1]+(long long)a[i]; 17 // return 0; 18 for (i=m; i<=n; i++) 19 { 20 //if (i%1000==0)cout<<i<<endl; 21 if (MAX1[i-1]>=sum[i]-sum[i-m]) 22 { 23 x1[i]=x1[i-1]; 24 MAX1[i]=MAX1[i-1]; 25 } 26 else 27 { 28 x1[i]=i-m+1; 29 MAX1[i]=sum[i]-sum[i-m]; 30 } 31 } 32 for (i=n-m+1; i>=1; i--) 33 { 34 if (MAX2[i+1]>sum[i+m-1]-sum[i-1]) 35 { 36 x2[i]=x2[i+1]; 37 MAX2[i]=MAX2[i+1]; 38 } 39 else 40 { 41 x2[i]=i; 42 MAX2[i]=sum[i+m-1]-sum[i-1]; 43 } 44 } 45 for (i=m; i<=n-m; i++) 46 { 47 if (MAX1[i]+MAX2[i+1]>MAX) 48 { 49 MAX=MAX1[i]+MAX2[i+1]; 50 ansx=x1[i]; ansy=x2[i+1]; 51 } 52 } 53 printf("%d %d ",ansx,ansy); 54 return 0; 55 }
全场最佳:我画的图片(