Лить воду, где пойдет не так? - PullRequest
2 голосов
/ 31 мая 2011

Я закончил Лить воду от SPOJ.Однако система продолжает давать неправильный ответ .Но я не могу выяснить, в чем дело.

Пожалуйста, дайте намек.Также приветствуются тестовые случаи.

#include <iostream>

int countFromA (int a, int b, int c);

int main() {
    int t;
    std::cin>>t;
    std::cin.ignore(5, '\n'); // SPOJ error: iostream limit
    while (t--) {
        int a, b, c;
        std::cin>>a>>b>>c;
        if (c == 0) {
            std::cout<<"0"<<std::endl;
        }
        else if (a == c || b == c) {
            std::cout<<"1"<<std::endl;
        }
        else if ((a < c && b < c) || (a == b)) {
            std::cout<<"-1"<<std::endl;
        }
        else {
            int fromA = countFromA (a, b, c);
            int fromB = countFromA (b, a, c);
            int result;
            if (fromA == -1) {
                result = fromB;
            }
            else if (fromB == -1) {
                result = fromA;
            }
            else if (fromA <= fromB) {
                result = fromA;
            }
            else {
                result = fromB;
            }
            std::cout<<result<<std::endl;
        }
    }
}

int countFromA (int a, int b, int c) {
    int times = 0;
    int a_in = 0;
    int b_in = 0;
    // fill a
    a_in = a;
    times++;
    while (true) {
        // a->b & test
        if (a_in > (b - b_in)) {
            a_in = a_in - (b - b_in);
            b_in = b;
            times++;
            if (a_in == c) {
                return times;
            }
        }
        else {
            b_in = b_in + a_in;
            a_in = 0;
            times++;

Ответ: должен добавить тест здесь.Я кодировал в предположении a > b, и при повторном его использовании я забыл.

        }
        // fill a / empty b
        if (b_in == b) {
            b_in = 0;
        }
        else {
            a_in = a;
        }
        times++;
        // finish
        if (a_in == b - b_in) {
            return -1;
        }
    }
}

Мой алгоритм сначала проверяет особые случаи if else if else if, а затем выполняет основной расчетв else.Для части else я написал функцию для преобразования первой переменной во вторую переменную.

1 Ответ

3 голосов
/ 31 мая 2011

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

У вас есть 4 различные операции, которые вам, возможно, придется объединить в любой последовательности, чтобы получить ответ.Предположим, что ваши цифры 21, 3, 15.Вам нужно смотреть оба раза, сбрасывая b в a, пока не наберете 15, или заполните a, продолжайте заливать его в b, затем сбрасывая b, пока не останется 15.Ваша текущая операция просто пытается выполнить одну последовательность операций.Вам нужно как-то попробовать оба с нуля, а затем выбрать лучший.

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