传统题 1000ms 256MiB

单种物品的库存变动

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

题意:

保管员管理一种物品,记录其名称和当前库存。

每次给出一个有符号整数 dd,表示本次库存变动量:

  • d>0d>0 表示入库;
  • d<0d<0 表示出库;
  • d=0d=0 表示库存不变。

如果执行本次操作后库存仍然非负,则执行操作;否则拒绝本次操作,库存保持不变。变动量为 00 时,操作成功。

本题采用函数接口提交方式(Template)。系统已提供下面的结构体定义:

struct item {
    char name[21];
    long long stock;
    int ok;
};

其中:

  • name 表示物品名称;
  • stock 表示当前库存;
  • ok 表示最近一次操作是否成功,1 表示成功,0 表示失败。

请选择 C 语言,只提交下面函数的完整定义:

struct item change(struct item a, long long d);

其中,参数 a 表示操作前的物品记录,参数 d 表示本次库存变动量。函数应返回操作后的完整记录。

函数需要满足以下要求:

  1. 如果 a.stock + d 非负,则将库存更新为 a.stock + d,并将 ok 设为 1。
  2. 如果 a.stock + d 为负数,则库存保持不变,并将 ok 设为 0。
  3. 无论操作是否成功,name 都应保持不变。
  4. 本次操作是否成功只由当前库存和本次变动量决定,与传入的 ok 值无关。

首次调用 change 前,系统会将 ok 初始化为 1。之后系统会按照输入顺序反复调用 change,并将每次返回的结构体作为下一次调用的参数。

系统会将你提交的函数定义插入下面代码的指定位置,再进行编译和运行:

#include <stdio.h>

struct item {
    char name[21];
    long long stock;
    int ok;
};

struct item change(struct item a, long long d);

/* 在此处插入你提交的函数定义。 */

int main(void) {
    struct item a;
    int q;
    scanf("%20s%lld%d", a.name, &a.stock, &q);
    a.ok = 1;

    for (int i = 0; i < q; i++) {
        long long d;
        scanf("%lld", &d);

        a = change(a, d);

        if (a.ok) {
            printf("OK %lld\n", a.stock);
        } else {
            printf("FAIL %lld\n", a.stock);
        }
    }

    printf("%s %lld\n", a.name, a.stock);

    return 0;
}

因此,你只需要实现 change 函数,不需要读入数据或输出结果,不要重复定义 struct item,也不要提交 main 函数。

输入格式:

以下输入由系统提供的外部代码读入。

第一行依次给出物品名称 namename、初始库存 stockstock 和操作次数 qq(1≤∣name∣≤201 \le |name| \le 20,0≤stock≤1090 \le stock \le 10^9,0≤q≤2×1050 \le q \le 2 \times 10^5)。

名称仅由小写英文字母组成,∣name∣|name| 表示名称的字符个数。

接下来 qq 行,每行一个整数 dd(−109≤d≤109-10^9 \le d \le 10^9),表示本次库存变动量。

输出格式:

以下输出由系统提供的外部代码完成。

对于每次操作:

  • 如果操作成功,输出 OK stock;
  • 如果操作失败,输出 FAIL stock。

其中,stock 表示本次操作处理后的实际库存。

全部操作结束后,再输出一行物品名称和最终库存,以一个空格分隔。

当 q=0q=0 时,只输出物品名称和初始库存。

样例:

样例输入:

camera 3 4
-4
-3
5
0

样例输出:

FAIL 3
OK 0
OK 5
OK 5
camera 5

样例解释:

初始库存为 33。

第一次操作的变动量为 −4-4,执行后库存将变为 −1-1,因此拒绝本次操作,库存仍为 33。

第二次操作的变动量为 −3-3,执行后库存变为 00,操作成功。

第三次操作的变动量为 55,库存变为 55。

第四次操作的变动量为 00,库存仍为 55,该操作仍然视为成功。

C Programming Practice Round 6

未参加
状态
已结束
规则
XCPC
题目
11
开始于
2026-10-8 0:00
结束于
2026-10-15 0:00
持续时间
168 小时
主持人
参赛人数
11