codeforces B.Fence 解题报告
题目链接: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 。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 using namespace std; 5 6 const int maxn = 2 * 1e6; 7 int a[maxn], b[maxn], s[maxn]; 8 9 int main() 10 { 11 int i, k, n, mini, tmpi, mint, sum; 12 while (scanf("%d%d", &n, &k) != EOF) 13 { 14 mint = 100000000; 15 mini = 1; 16 for (i = 1; i <= n; i++) 17 { 18 scanf("%d", &a[i]); 19 if (i == 1) 20 b[i] = a[i]; 21 else 22 b[i] = b[i-1] + a[i]; 23 if (i-k >= 0) 24 { 25 sum = b[i] - b[i-k]; 26 tmpi = i-k+1; 27 if (sum < mint) // 每当当前的sum比mint小都要更新mini的值,表示sum里面中的第一个数的下标
28 { 29 mint = sum; 30 mini = tmpi; 31 } 32 } 33 } 34 printf("%d\n", mini); 35 } 36 return 0; 37 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步