题目背景
(本道题目隐藏了两首歌名,找找看哪~~~)
《爱与愁的故事第一弹·heartache》第一章。
《我为歌狂》当中伍思凯神曲《舞月光》居然没赢给萨顶顶,爱与愁大神心痛啊~~~而且最近还有一些令人伤心的事情,都让人心痛(最近真的很烦哈)……
题目描述
最近有 n 个不爽的事,每句话都有一个正整数刺痛值(心理承受力极差)。爱与愁大神想知道连续 m 个刺痛值的和的最小值是多少,但是由于业务繁忙,爱与愁大神只好请你编个程序告诉他。
输入格式
第一行有两个用空格隔开的整数,分别代表 n 和 m。
第 2 到第 (n+1)行,每行一个整数,第 (i+1)行的整数 ai代表第 i 件事的刺痛值 ai。
输出格式
输出一行一个整数,表示连续 m 个刺痛值的和的最小值是多少。
输入输出样例
输入 #1复制
8 3 1 4 7 3 1 2 4 3
输出 #1复制
6
说明/提示
解题思路
数据规模与约定
- 对于 30% 的数据,保证 n≤20。
- 对于 60%的数据,保证 n≤100。
- 对于 90%的数据,保证 n≤10的三次方。
- 对于 100%100% 的数据,保证 0≤m≤n≤3×10的三次方,1≤ai≤100。
本题要求找到连续m
个刺痛值的和的最小值。为此,我们需要遍历数组中的所有可能的连续m
个元素,并计算它们的和,然后找出这些和中的最小值。
首先,我们需要从用户那里接收两个整数n
和m
,其中n
是刺痛值的总数,m
是要求连续和的元素个数。然后,我们接收n
个刺痛值并存储在数组中。
接下来,我们遍历数组,对于每个可能的起始位置(从第1个元素到第n-m+1
个元素),我们计算从这个位置开始的连续m
个元素的和。在遍历过程中,我们记录并更新遇到的最小和。
示例代码
#include<bits/stdc++.h>
using namespace std;
int a[30001]; // 根据题目要求,数组大小至少为3*10^3+1
int main() {
int n, m;
cin >> n >> m; // 读取n和m
for (int i = 1; i <= n; i++) {
cin >> a[i]; // 读取每个刺痛值并存储在数组中
}
int mi = INT_MAX; // 使用INT_MAX作为最小和的初始值
for (int i = 1; i <= n - m + 1; i++) { // 遍历所有可能的起始位置
int sum = 0;
for (int j = 0; j < m; j++) { // 计算连续m个刺痛值的和
sum += a[i + j]; // 注意数组索引从1开始,但循环从0开始,因此这里使用i+j
}
if (sum < mi) { // 如果当前和小于已知的最小和,则更新最小和
mi = sum;
}
}
cout << mi << endl; // 输出连续m个刺痛值的和的最小值
return 0;
}