在公园喂猫和狗的C程序

yftpprvb  于 2023-03-29  发布在  其他
关注(0)|答案(1)|浏览(98)

以下是我想解决的问题:

为了喂公园里的猫和狗,你准备了D份狗粮和C份猫粮。

  • 在一个队列中总共有N个动物在等待,其中一些是狗,另一些是猫。可能队列中的所有动物都是狗,或者所有动物都是猫。一个由N个字符C和D组成的字符串S表示队列中猫和狗的顺序。如果队列中的第i个动物是猫,则第i个字符等于C。同样,如果行中的第i个动物是狗,则第i个字符等于D。
  • 每只狗吃一份狗粮,每只猫吃一份猫粮。此外,你还有额外的猫粮。每次狗吃食物时,你都会给猫带M份额外的猫粮。
  • 动物必须按照排队的顺序进食,只有在它之前的动物已经进食的情况下,它才能进食。这意味着如果你用完了狗(或猫)的食物部分,而狗(或猫)即将被喂食,队列不会移动,因为所有的动物都会耐心等待。
  • 您需要确定在这种情况下,是否所有的狗都将被喂食。请注意,这意味着一些猫可能会留在队列中,但不用担心,您最终会喂它们!
    输入:
  • 输入的第一行给出了测试用例的数量,T. T测试用例紧随其后。
  • 每个测试用例的第一行包含四个整数N、D、C和M:动物的数量、狗食部分的初始数量、猫食部分的初始数量以及在狗吃了一部分狗食之后我们分别添加的猫食的附加部分。
  • 下一行包含长度为N的字符串S,表示动物的排列:
2
12 4 2 2
CDCCCDCCDCDC
8 2 1 3
DCCCCCDC

输出:

  • 对于每个测试用例,输出包含用例#x的一行:y,其中x是测试用例编号(从1开始),如果所有犬都将喂食,则y为“是”,否则为“否”。

上述输入的预期输出:

Case #1: YES
Case #2: NO

**我的问题:**我一直得到两个测试用例都是YES。

Case #1: YES
Case #2: 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;
}

有谁能给我指个方向吗?有什么问题尽管问。

ogq8wdun

ogq8wdun1#

很简单,D是“dog meals available”,代码在递减该变量的同时递增另一个变量:DogsFed......然后有一大堆混乱的代码试图计算其他数字(坦率地说,我懒得去尝试遵循这些数字)。
D == DogsFed(幸运的是,两个测试数据样本都有一个偶数的狗要喂!)
少用带有描述性名称的变量!
下面的方法看起来是可行的(在编译时进行数据初始化,因为重新输入数据是很繁琐的)。首先让代码按照你想要的方式工作,然后修改它以接受用户输入(或来自文件的输入)。然后开始检查来自scanf()的返回代码!如果用户没有输入适当的数据,用户输入可能会让你的程序进入模糊地带。

#include <stdio.h>

int main( void ) {
    // a struct to facilitate compile time initialisation of data
    typedef struct {
        int nDC, nDmeals, nCmeals, nExtraCatMeals;
        char *queue;
    } case_t;

    // OP sample data for 2 test cases
    case_t cases[] = {
        { 12, 4, 2, 2, "CDCCCDCCDCDC" },
        {  8, 2, 1, 3, "DCCCCCDC" },
    };

    // deal with each batch of sample data
    for( int i = 0; i < sizeof cases/sizeof cases[0]; i++ ) {
        case_t *p = &cases[i];

        // Loop, hoping to reach end of the queue ("number of Dogs & Cats")
        int z = 0;
        while( z < p->nDC ) {
            switch( p->queue[z] ) {
                case 'D':
                    p->nDmeals -= 1; // dispense a dog meal
                    p->nCmeals += p->nExtraCatMeals; // load up on more
                    break;

                case 'C':
                    p->nCmeals -= 1; // dispense a cat meal
                    break;
            }
            // Break the loop if treading into unavailable meals.
            if( p->nDmeals < 0 || p->nCmeals < 0 ) // gone too far??
                break;
            z++;
        }
        // Yes/No as to feeding all the animals in the queue
        printf("Case #%d: %s\n", i+1, z == p->nDC ? "Yes" : "No" );
    }

    return 0;
}

输出:

Case #1: Yes
Case #2: No

尽量使用所需的最小数量的变量。人类(读者)很难跟踪太多的值,特别是当一些值增加而另一些值减少时...

编辑

为了保持更少变量的想法(供人类跟踪),以下是一种替代方案。
每天的“动物数量”是多余的,已经被删除。每次迭代,一只猫被喂食。如果迭代实际上是一只狗,那么猫是“未喂食”的,并且添加更多的猫餐。
给予一下。注意,使用添加到days[]的额外或修改的数据行进行测试是多么容易。更少的代码(正确执行)是“更好的代码”(imho)。

#include <stdio.h>

typedef struct {
    int DogMeals, CatMeals, CatPlus;
    char *pQ;
} day_t;

day_t days[] = {
    { 4, 2, 2, "CDCCCDCCDCDC" },
    { 2, 1, 3, "DCCCCCDC" },
    { 3, 1, 3, "DCCDCCDC" },
    { 3, 1, 1, "DCCDCCDC" },
};

int main( void ) {
    for( size_t i = 0; i < sizeof days/sizeof days[0]; i++ ) {
        day_t *p = &days[i];
        do {
            p->CatMeals -= 1;
            if( *p->pQ == 'D' ) {
                p->DogMeals -= 1;
                p->CatMeals += 1 + p->CatPlus;
            }
        } while( p->DogMeals >= 0 && p->CatMeals >= 0 && *++p->pQ );

        printf( "Day %d: Unfed '%s'\n", i+1, p->pQ );
    }
    return 0;
}

相关问题