Какой тестовый пример мне не хватает? - PullRequest
0 голосов
/ 08 сентября 2018

Я решал вопрос. Но я что-то упустил. Есть какой-то тестовый случай, для которого мое решение неверно. Мне нужно найти этот контрольный пример. В другой подзадаче говорится, что выполнение заняло слишком много времени.

Шеф получит доступ к Дискурсу, если его знания и сила станут точно равными N и M соответственно. Изначально у него есть сила 1 и знания 1.

Шеф-повар может выполнять действия следующих типов для улучшения своих навыков:

  • Решите задачу - увеличьте свои знания на X
  • сделать отжимание - увеличьте его силу на Y
  • установите ShareChat, чтобы поддерживать связь с друзьями - увеличьте свои знания и возможности на 1

Шеф-повар может установить ShareChat не более одного раза. Остальные действия могут быть выполнены любое количество раз, и действия могут быть выполняется в любом порядке.

Помогите шеф-повару выяснить, можно ли перейти от обсуждения к обсуждению.

Input

Первая строка ввода содержит одно целое число T, обозначающее количество тестовых случаев. Описание T-тестов приведено ниже.

Первая и единственная строка каждого теста содержит четыре целых числа через пробел: N, M, X и Y.

выход

Для каждого теста выведите одну строку, содержащую строку «Chefirnemo», если есть возможность получить необходимые знания и мощность или "пофик", если это невозможно

Вы также можете посетить эту ссылку, чтобы прочитать вопрос Ссылка на вопрос https://www.codechef.com/SEPT18B/problems/CHEFADV Мое решение -

#include<stdio.h>
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            long int n,m,x,y,power,know;
            scanf("%ld%ld%ld%ld",&n,&m,&x,&y);
            power=1;
            know=1;
            if(power+1==m && know+1==n)
                printf("Chefirnemo\n");
            else {
                while(power+y<m)
                    power=power+y;
                if(power+y==m)
                    power=power+y;
                while(know+x<n)
                    know=know+x;
                if(know+x==n)
                    know=know+x;
                if(power==m && know==n)
                    printf("Chefirnemo\n");
                else if(power+1==m && know+1==n)
                    printf("Chefirnemo\n");
                else
                    printf("Pofik\n");
            }
        }
        return 0;
    }

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Ваш код не работает, если либо x==1 и (m-1)%y==1, либо наоборот (то есть y==1 и (n-1)%x==1). Тогда ваша итерация увеличится с power до n и know до m-1, когда установка ShareChat не может помочь. Однако, если бы вы увеличили power только до n-1, установка ShareChat получит совпадение.

Правильное решение должно относиться к установке ShareChat более осторожно. Например

bool chefirnemo(int n, int m, int x, int y)
{
    // 0 check that input is okay
    assert(1<=n && 1<=m && 1<=x && 1<=y);
    // 1 change to the equivalent problem where power
    //   and knowledge are 0 initially
    --n; --m;
    // 2 try w/o installation of ShareChat:
    if (n>=0 && (n%x)==0 && m>=0 && (m%y)==0)
        return true;
    // 3 install ShareChat
    --n; --m;
    // 4 try again
    return (n>=0 && (n%x)==0 && m>=0 && (m%y)==0);
}
0 голосов
/ 10 сентября 2018

хотя Уолтер указывает на возможные подсказки. решение, похоже, не работает.

0 голосов
/ 08 сентября 2018
  1. Ваши правила не гарантируют, что входные данные являются положительными. Если X или Y равен нулю, ваши циклы никогда не заканчиваются. (Обратите внимание, это проблема с вашим перефразированием, правила вызова гарантируют положительные значения)

    Контрольный пример: 2 2 0 0

    Контрольный пример: 2 4 0 2

    Контрольный пример: 4 4 1 0

  2. Сколько раз вы применяете (+ X, 0) и (0, + Y), должно зависеть от того, используется ли действие (+ 1, + 1) ... но вы уже заблокировали свое решение .

    Контрольный пример: 5 6 1 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...