药房管理

GitHub跳转原题关系图返回列表

维护剩余库存线性模拟取药过程,统计库存不足被拒绝的病人数。

OJ: roj

题目 ID: 1075

难度:入门

标签:模拟入门

创建: 2026-09-29 17:30

更新: 2026-10-05 00:21

题目描述

药房已知某种药品每天开始时的库存总量 mm,一天内不进货。当天有 nn(0<n⩽1000 < n \leqslant 100)个病人按时间先后顺序前来取药:若第 ii 个病人想取的 aia_i 不超过当时剩余库存则取药成功,否则请求被拒绝。输入共 3 行:mm、nn、以及 nn 个取药数量 a1,…,ana_1, \dots, a_n;输出一行,为没有取上药品的人数。样例输入 30、6、10 5 20 6 7 8,输出 2。

思路

按时间顺序线性模拟:用一个变量维护当前剩余库存,逐个读入需求,库存够就扣减、不够就把答案加一,边读边处理即可。时间复杂度 O(n)O(n)。样例中需求 20,7,820,7,8 到来时库存不足,故答案为 22。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-07-03 11:23
# update_at: 2026-07-03 11:23

import sys


def solve() -> None:
    data = iter(map(int, sys.stdin.buffer.read().split()))
    stock = next(data, 0)          # 药房当前剩余库存
    patients = next(data, 0)       # 取药人数
    rejected = 0

    for amount in data:            # 按时间顺序处理每个病人的取药请求
        if stock >= amount:        # 库存足够,发药并扣减库存
            stock -= amount
        else:                      # 库存不足,拒绝该病人
            rejected += 1

    print(rejected)


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 00:21
 * update_at: 2026-10-05 00:21
 */

#include <cstdio>

typedef long long ll;

ll m;          // 每天开始时的药品库存总量
ll n;          // 这一天前来取药的病人数
ll rejectCnt;  // 没有取上药的病人数(答案)

int main() {
    scanf("%lld", &m);
    scanf("%lld", &n);
    for (ll i = 1; i <= n; ++i) {
        ll a;   // 当前病人希望取走的药品数量
        scanf("%lld", &a);
        if (m >= a)  // 库存足够,发药并扣减库存
            m -= a;
        else         // 库存不足,拒绝该病人
            ++rejectCnt;
    }
    printf("%lld\n", rejectCnt);
    return 0;
}