Я закончил 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;
}
}
}
Мой алгоритм первой проверки особых случаев if
else if
else if
, а затем сделать основной расчет в else
. Для части else
я написал функцию, чтобы вылить из первой переменной во вторую переменную.
Я пробовал оба 'int fromA = countFromA (a, b, c); int fromB = countFromA (b, a, c); '. Вы видите, что первым является 'a, b', а второй -' b, a'. –
@ Dante Jiang: Мне кажется, что 'countFromA' не заметит, если' b_in' завершает ответ, который вы ищете после сброса всех 'a'. – btilly
не могли бы вы любезно предоставить мне неудачный случай? –