您的位置:首页 > Web前端

codeforces B.Fence 解题报告

2013-11-19 16:09 120 查看
题目链接:http://codeforces.com/problemset/problem/363/B

题目意思:给定整数n和k,需要从n个数中找出连续的k个数之和最小,输出这连续的k个数中的第一个数的下标。

直接暴力果断TLE,于是想到之前做的那条332B - Maximum Absurdity DP题的做法,决定开多一个额外的数组b[],在输入的时候把a[i]中前i个数的和都记录到b[i]中,这样通过b[i] - b[i-k]即可得出序列h1, h2, ..., hn (1 ≤ hi ≤ 100) 所有连续的k个数之和。特别要注意,当i-k >= 0的时候才能进行相减的操作,防止数组下标越界。

还有另外mint 的设置要足够的大。考虑到 hi 最大为100,k最大为1.5·105, 即连续k个数的和最大为1.5 * 10^7 ,那么mint初始时要比这个数大,这里我设为100000000 。

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

const int maxn = 2 * 1e6;
int a[maxn], b[maxn], s[maxn];

int main()
{
int i, k, n, mini, tmpi, mint, sum;
while (scanf("%d%d", &n, &k) != EOF)
{
mint = 100000000;
mini = 1;
for (i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
if (i == 1)
b[i] = a[i];
else
b[i] = b[i-1] + a[i];
if (i-k >= 0)
{
sum = b[i] - b[i-k];
tmpi = i-k+1;
if (sum < mint)   // 每当当前的sum比mint小都要更新mini的值,表示sum里面中的第一个数的下标
{
mint = sum;
mini = tmpi;
}
}
}
printf("%d\n", mini);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: