先说一下一个有趣的事情,这道题我在12月第一次写,一般写过会有做题记录,刚刚在一份用户自创题单又遇到过,直觉告诉我这题似曾相识,但是却想不起来了,我又写了一遍,不过两次方法不一样。
题目描述
最近有 n 个不爽的事,每句话都有一个正整数刺痛值(心理承受力极差)。爱与愁大神想知道连续 m 个刺痛值的和的最小值是多少,但是由于业务繁忙,爱与愁大神只好请你编个程序告诉他。
输入格式
第一行有两个用空格隔开的整数,分别代表 n 和 m。
第 2 到第 (n+1) 行,每行一个整数,第 (i+1) 行的整数 ai 代表第 i 件事的刺痛值 ai。
输出格式
输出一行一个整数,表示连续 m 个刺痛值的和的最小值是多少。
输入输出样例
输入
8 3 1 4 7 3 1 2 4 3
输出
6
题解
一维前缀和的应用,前缀和类似高中的数列前n项和,设一个数组arr[500],sum[500],sum[i]代表arr[0]到arr[i]的和。
sum[0]=arr[0] ,i=0
sum[i]=sum[i-1]+arr[i] ,i>0
#include<bits/stdc++.h>
using namespace std;
int arr[3000];
int sum[5000];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
sum[0] = arr[0];//i=0的前缀和
for (int i = 1; i < n; i++)sum[i] = sum[i - 1] + arr[i];//i>0的前缀和
int min = sum[m - 1];
for (int i = 1; i <=n - m; i++)
{
if(min > (sum[i + m - 1] - sum[i-1]))min =sum[i + m - 1] - sum[i-1];
}
cout << min;
return 0;
}
下面是第一次写的代码,没用前缀和,前缀和是一种预处理,可以降低时间复杂度。