最大值(东方化改题+老师给的题解)

题目描述

⑨有一本书,上面有很多有趣的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\n",ansx,ansy);
54     return 0;
55 }

全场最佳:我画的图片(

posted on 2018-02-23 20:12  bb机  阅读(152)  评论(0编辑  收藏  举报

导航