1 条题解

  • 0
    @ 2026-6-19 10:30:54

    📝 题目大意

    有一瓶可消毒 MM 只手的消毒液,NN 个外星人依次前来,每个有 HiH_i 只手。求有多少个外星人能完整消毒所有手——一旦某个外星人消毒液不够,他会用光剩余消毒液,后续外星人无法再消毒。

    💡 解题思路

    1. 题目分析N,M,Hi100N, M, H_i \leq 100,数据范围极小,直接模拟即可。关键点在于:一旦剩余消毒液不足以满足当前外星人的需求,过程立即终止,后续外星人无法再消毒。
    2. 算法推导:用 remain 记录剩余消毒液量,初始为 MM。遍历每个外星人,若 remain >= H[i],则 remain -= H[i]count++;否则直接 break 退出循环。最终输出 count
    3. 边界与细节:当 MM 恰好够所有外星人时,count = N;当第一个外星人就不够时,count = 0。注意 break 的时机——剩余量不足当前外星人需求时立刻终止,不能再继续循环。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),单次遍历。
    • 空间复杂度O(N)O(N),存储 HH 数组;也可优化到 O(1)O(1),边读边处理。

    💻 标准代码 (C++)

    #include <iostream>
    #include <vector>
    using namespace std;
    int main() {
        int N, M;
        cin >> N >> M;
        vector<int> H(N);
        for (int i = 0; i < N; i++) {
            cin >> H[i];
        }
        int remain = M;      // 剩余消毒液量
        int count = 0;       // 完全消毒的外星人数
        for (int i = 0; i < N; i++) {
            if (remain >= H[i]) {   // 剩余量足够当前外星人消毒全部手
                remain -= H[i];     // 扣除对应手数
                count++;            // 计数 +1
            } else {
                break;              // 不够则终止,后续外星人无法再消毒
            }
        }
        cout << count << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    799
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者