You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言代码错误排查:公园猫狗喂食测试用例误判

公园猫狗喂食算法问题排查

问题需求

准备D份狗粮、C份猫粮,N只动物按队列等待,字符串S表示动物顺序(C为猫,D为狗)。喂食规则:

  • 按队列顺序喂食,每只狗吃1份狗粮,每只猫吃1份猫粮;
  • 每喂一只狗,额外获得M份猫粮;
  • 若当前动物对应食物耗尽,队列停止前进;
  • 需判断所有狗是否都能被喂食。

输入格式

  • 第一行输入测试用例数T;
  • 每个测试用例第一行输入整数N、D、C、M;
  • 第二行输入字符串S。

示例输入

2
12 4 2 2
CDCCCDCCDCDC
8 2 1 3
DCCCCCDC

预期输出

Case #1: YES
Case #2: NO

我的问题

我编写的C代码运行后两个测试用例均输出YES,与预期不符。

我的代码

#include <stdio.h>

int main(int argc, char *argv[]) {
    int T, N, D, C, M;
    char s[1000001];

    scanf("%d", &T);

    for (int i = 1; i <= T; ++i) {
        scanf("%d %d %d %d %s", &N, &D, &C, &M, s);

        int Dogs = 0;
        int Cats = 0;
        int DogsFed = 0;
        int CatsFed = 0;

        for (int j = 0; j < N; j++) {
            if (s[j] == 'D') {
                Dogs++;
            }
            if (s[j] == 'C') {
                Cats++;
            }
        }

        while (C > 0 && (D > DogsFed || (D == DogsFed && s[N-1] == 'D'))) {
            for (int z = 0; z < N; z++) {
                if ((s[z] == 'D') && (D > 0)) {
                    DogsFed++;
                    D--;
                    if (M > 0) {
                        C += M;
                    }
                }

                else if ((s[z] == 'C') && (C >= (Cats-CatsFed))) {
                    CatsFed++;
                    C--;
                }
            }
        }

        if (DogsFed == Dogs) {
            printf("Case #%d: YES\n", i);
        } else {
            printf("Case #%d: NO\n", i);
        }
    }

    return 0;
}

代码问题分析

你的代码逻辑完全偏离题目规则,核心错误点如下:

  1. 循环逻辑错误:用外层while嵌套内层for反复遍历整个队列,不符合题目“按队列顺序前进,遇到食物耗尽立即停止”的要求。题目要求逐个处理动物,遇到无法喂食的就终止流程,而非反复从头遍历。
  2. 猫的喂食条件错误:判断C >= (Cats-CatsFed)才喂猫完全不合理,正确逻辑是轮到这只猫时,只要当前还有猫粮(C > 0)就可以喂食,无需考虑剩余所有猫的需求。
  3. 未正确处理停止条件:处理到某只动物时,若对应食物耗尽,没有立即终止整个喂食流程,导致后续错误的喂食操作。

修正思路

正确做法是按队列顺序逐个处理每只动物:

  • 遍历字符串S的每个字符,依次处理每只动物;
  • 遇到狗:
    • 若D>0,喂食它(D--,fed_dogs++),并增加M份猫粮(C+=M);
    • 若D=0,直接停止遍历;
  • 遇到猫:
    • 若C>0,喂食它(C--);
    • 若C=0,直接停止遍历;
  • 遍历结束后,判断fed_dogs是否等于总狗数。

修正后的参考代码

#include <stdio.h>

int main() {
    int T;
    scanf("%d", &T);
    for (int case_num = 1; case_num <= T; case_num++) {
        int N, D, C, M;
        char s[1000001];
        scanf("%d %d %d %d %s", &N, &D, &C, &M, s);
        
        int total_dogs = 0;
        for (int i = 0; i < N; i++) {
            if (s[i] == 'D') total_dogs++;
        }
        
        int fed_dogs = 0;
        int stop = 0;
        for (int i = 0; i < N; i++) {
            if (stop) break;
            if (s[i] == 'D') {
                if (D > 0) {
                    D--;
                    fed_dogs++;
                    C += M;
                } else {
                    stop = 1;
                }
            } else {
                if (C > 0) {
                    C--;
                } else {
                    stop = 1;
                }
            }
        }
        
        printf("Case #%d: %s\n", case_num, fed_dogs == total_dogs ? "YES" : "NO");
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Fab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:43:13