福州大学 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; }
相关文章推荐
- 福州大学 Problem 2168 防守阵地 I
- FZU_Problem 2168 防守阵地 I
- FZU Problem 2168 防守阵地 I
- FZU_Problem 2168 防守阵地 I
- FZU_Problem 2168 防守阵地 I
- FZU Problem 2168 防守阵地 I
- FZU Problem 2168 防守阵地 I
- FZU 2168 防守阵地 I(公式推导)(经典)(中等)
- 2168 防守阵地 I(简单数学题)
- FZU Problem 2171 防守阵地 II (线段树区间更新模板题)
- FZU 2168 防守阵地 I
- FZU 2168 防守阵地 I
- FZU 2168 防守阵地 I
- FZU_2168_防守阵地I
- FZU2168——防守阵地 I——————【找规律或前缀和】
- FZU Problem 2171 防守阵地 II (裸线段树 懒惰标记)
- FZU2168:防守阵地 I
- FZU2168 防守阵地 I
- FZU Problem 2171 防守阵地 II (线段树,区间更新)
- FZU 2168 防守阵地 I (递推)