倒水,哪里出了问题
Pouring Water, where goes wrong?
我已经完成了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
部分,我已经编写了一个函数来将第一个变量转换为第二个变量。
这里有一个提示。由于这是一个有益于您的编码练习,我不会给您完整的答案。
你有4种不同的操作,你可能需要按任何顺序组合才能得到答案。假设你的号码是21, 3, 15
。您需要反复查看这两种情况,将b
转储到a
中,直到其中有15
,或者填充a
,继续将其转储到b
中,然后转储b
,直到还剩15
。您当前的操作只是尝试单个操作序列。你需要以某种方式从头开始尝试这两个,然后选择最好的一个。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 倒水,哪里出了问题