题目描述
货运公司每天需要筛选好多货物,于是员工打起了自己的小算盘:公司一次进口n件货物,每件货物都有自己的重量。员工想知道连续m件货物的重量最小值为多少,但由于能力有限,需要请你编个程序告诉他。
输入格式
第一行有两个用空格隔开的整数,分别代表n和m。第2到第(n+1)行,每行一个整数,第(i+1)行的整数ai代表第i件货物的重量。
输出格式
输出一行一个整数,表示连续m件货物的重量最小值之和
源代码
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int arr[n];
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
int sum = 0; // 记录连续m件货物的重量最小值之和,初始化为0
int min_sum = 0; // 记录当前的连续m件货物的重量最小值之和,初始化为0
int start = 0; // 记录当前连续m件货物的起始位置,初始化为0
for (int i = 0; i < n; i++) {
sum += arr[i]; // 先加上当前货物的重量
if (i - start >= m) { // 如果当前连续m件货物已经超过m了,就需要把第start个货物的重量去掉
sum -= arr[start];
start++; // 同时更新当前连续m件货物的起始位置
}
if (i - start + 1 == m) { // 如果当前连续m件货物刚好等于m,则计算它们的重量最小值并加入到min_sum中
int min_weight = arr[start];
for (int j = start + 1; j <= i; j++) {
if (arr[j] < min_weight) {
min_weight = arr[j];
}
}
min_sum += min_weight;
}
}
cout << min_sum << endl; // 输出结果
return 0;
}
首先我们输入n和m表示一次进口n件货物,连续m件货物的重量最小值为多少。然后定义一个长度为n的数组arr来存储这n个货物的重量。
接着,我们使用双指针技巧,定义变量sum来记录当前连续m件货物的重量之和(初始时也包括前m-1件),min_sum来记录所有连续m件货物的重量最小值之和,start来记录当前连续m件货物的起始位置(即第一件货物的位置)。然后使用for循环遍历数组arr,依次计算sum和min_sum。
在每次遍历时,先将当前货物的重量加入sum中,然后判断是否需要去掉第start个货物的重量(也就是当前连续m件货物已经超过m了),如果需要就去掉第start个货物的重量,并且更新当前连续m件货物的起始位置start。接着,如果当前连续m件货物刚好等于m,则计算它们的重量最小值并加入到min_sum中。
最后根据计算得到的min_sum输出结果。
© 版权声明
本站资源来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!
THE END