C++编写程序之偷懒的员工

题目描述

货运公司每天需要筛选好多货物,于是员工打起了自己的小算盘:公司一次进口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
喜欢就支持一下吧
点赞8赞赏 分享