题解:洛谷 P1614 爱与愁的心痛
【题目来源】
【题目描述】
最近有 \(n\) 个不爽的事,每句话都有一个正整数刺痛值(心理承受力极差)。爱与愁大神想知道连续 \(m\) 个刺痛值的和的最小值是多少,但是由于业务繁忙,爱与愁大神只好请你编个程序告诉他。
【输入】
第一行有两个用空格隔开的整数,分别代表 \(n\) 和 \(m\)。
第 \(2\) 到第 \((n+1)\) 行,每行一个整数,第 \((i+1)\) 行的整数 \(a_i\) 代表第 \(i\) 件事的刺痛值 \(a_i\)。
【输出】
输出一行一个整数,表示连续 \(m\) 个刺痛值的和的最小值是多少。
【输入样例】
8 3
1
4
7
3
1
2
4
3
【输出样例】
6
【算法标签】
《洛谷 P1614 爱与愁的心痛》 #模拟# #贪心# #枚举# #洛谷原创#
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
int a[3000]; // 定义全局数组:存储输入的数字序列
int main()
{
int n, m; // 定义变量:n-数字总数,m-子序列长度
int i, j; // 定义循环变量
int sum = 0; // 定义变量:当前子序列的和
int min = 2147483647;// 定义变量:最小子序列和,初始为最大整数值
cin >> n >> m; // 输入数字总数和子序列长度
// 输入数字序列
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
// 特殊情况处理:当子序列长度等于总长度时
if (m == n)
{
// 直接计算整个序列的和
for (i = 0; i < n; i++)
{
sum += a[i];
}
min = sum; // 整个序列的和就是最小值
}
else
{
// 常规情况:遍历所有可能的子序列
for (i = 0; i <= n - m; i++)
{
sum = 0; // 重置当前子序列和
// 计算当前子序列的和
for (j = i; j < i + m; j++)
{
sum += a[j];
}
// 更新最小子序列和
if (sum < min)
min = sum;
}
}
cout << min; // 输出最小子序列和
return 0; // 程序正常结束
}
【运行结果】
8 3
1
4
7
3
1
2
4
3
6
浙公网安备 33010602011771号