2011-05-31 3 views
2

Я закончил Pouring Water из 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; 
     } 
    } 
} 

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

ответ

3

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

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

+0

Я пробовал оба 'int fromA = countFromA (a, b, c); int fromB = countFromA (b, a, c); '. Вы видите, что первым является 'a, b', а второй -' b, a'. –

+0

@ Dante Jiang: Мне кажется, что 'countFromA' не заметит, если' b_in' завершает ответ, который вы ищете после сброса всех 'a'. – btilly

+0

не могли бы вы любезно предоставить мне неудачный случай? –

Смежные вопросы