2168 防守阵地 I(简单数学题)

来源:互联网 发布:访客网络应该限速多少 编辑:程序博客网 时间:2024/06/10 03:59
 Problem 2168 防守阵地 I

Accept: 441    Submit: 1546
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



这题就是在1-n里选1-m个连续的数,因为是连续的,所以从一开始与从二开始只是将a1+a2+a3剪去,这样就还剩下a2*1+a3*2了,之后再加a3+a4*3就OK了。


AC代码:


#include<cstdio>#define T 1000005int a[T];int main(){    /*freopen("input.txt","r",stdin);*/int n,m,ma,ans,i,v;while(~scanf("%d%d",&n,&m)){ans = 0;v = 0;for(i=0;i<n;++i){  scanf("%d",&a[i]);  if(i<m){  ans+=a[i]*(i+1);  v+=a[i];  }}ma = ans;for(i=1;i<=n-m;++i){ans = ans - v + a[m+i-1]*m;v = v - a[i-1] + a[m+i-1]; if(ma<ans){ma = ans;}}printf("%d\n",ma);}    return 0;}



0 0