您的位置:首页 > 其它

福州大学 Problem 2168 防守阵地 I

2014-04-27 20:05 197 查看

Problem 2168 防守阵地 I



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 32 1 3 1 4



Sample Output

17

/*
*  解题思路: M数组在N数组上移动时:
*      2   1  3  1  4
*      1   2  3
*           1  2  3
*               1  2  3
*  可以看出M数组每移动一步,对应N数组无规则变化的只有首尾元素
*  所以, 当前步参考指数= 上一步参考指数 - 上一步M数组对应N数组值和 + 因为移动添加的尾元素
*/
#include <stdio.h>
int all[1000005];
int main()
{
	int n, m;
	while (scanf("%d%d", &n, &m) != EOF)
	{
		for (int i = 1; i <= n; i++)
			scanf("%d", &all[i]);
		int use = 0, u = 0;
		for (int i = 1; i <= m; i++){
			use += i*all[i];
			u += all[i];
		}
		int ans = use;
		for (int i = 2; i <= n - m + 1; i++){
			use = (use - u) + all[i + m - 1] * m;
			u -= all[i - 1];  //减去因为移动失去的首元素
			u += all[i + m - 1];// 添加因为移动添加的尾元素
			if (use > ans)
				ans = use;
		}
		printf("%d\n", ans);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: