FZU 2168

来源:互联网 发布:访客网络应该限速多少 编辑:程序博客网 时间:2024/05/21 05:04



#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define N 1000009#define LL long longLL max(LL a, LL b){return a > b ? a : b;}LL sum[N],a[N];int main(){#ifdef CDZSCfreopen("i.txt", "r",stdin);#endifint n, m;while (~scanf("%d%d", &n, &m)){memset(sum, 0, sizeof(sum));for (int i = 0; i < n; i++)scanf("%lld", a + i);for (int i = 0; i < m; i++){sum[m-1] += a[i];}for (int i = m; i < n; i++){sum[i] = sum[i-1] - a[i - m]+a[i];}//for (int i = 0; i < n; i++)//printf("%d\n", sum[i]);LL ans =-1,temp=0;for (int i = 0; i < m; i++){temp+= a[i] * (i + 1);}//printf("%lld\n", temp);for (int i = m; i < n; i++){temp -= sum[i - 1];temp += m*a[i];ans = max(ans, temp);//printf("%lld\n", temp);}printf("%lld\n", ans);}return 0;}

这里假设m=3, sum1=1*a1+2*a2+3*a3----->>>>下一个答案是sum2=a2*1+a3*2+a3*3,则可以得到关系式sum2=sum1-(a1+a2+a3)+m*a4。因此可以得到一个通式sum(n)=sum(n-1)-(a[n]+.......a[n+m])+m*a[n+m+1].只要先预处理前m个数的和,然后按照以上思路O(n)的复杂度求出所有答案。不断更新答案即可


Problem 2168 防守阵地 I

Accept: 442    Submit: 1549
Time Limit: 3000 mSec    Memory Limit : 32768 KB

 Problem Description

部队中共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个需要防守的地点,按重要程度从低到高排序,依次以数字1到M标注每个地点的重要程度,指挥部将选择M个士兵依次进入指定地点进行防守任务,能力指数为X的士兵防守重要程度为Y的地点将得到X*Y的参考指数。现在士兵们排成一排,请你选择出连续的M个士兵依次参加防守,使得总的参考指数值最大。

 Input

输入包含多组数据。

输入第一行有两个整数N,M(1<=N<=1000000,1<=M<=1000),第二行N个整数表示每个士兵对应的能力指数Xi(1<=Xi<=1000)。

对于30%的数据1<=M<=N<=1000。

 Output

输出一个整数,为最大的参考指数总和。

 Sample Input

5 3
2 1 3 1 4

 Sample Output

17


0 0