倒水问题:给定2 个没有刻度容器,对于任意给定的容积,求出如何只用两个瓶装出L 升
的水,如果可以,输出步骤,如果不可以,请输出No Solution。
第一行分别输入两个整形数值,分别代表两个容器的容积,第二行输入想要装出的目标水量。
时间复杂度为O(n),空间复杂度为O(1)
- 将第一个容器装满水,并记录下装水的位置(假设为A)。
- 将第一个容器中的水倒入第二个容器中,并记录下此时第一个容器的水位(假设为B)。
- 将第二个容器中的水倒掉,并将第一个容器中的水倒回第一个容器,倒到之前记录的位置A处,此时第一个容器中的水容积为B-A。
- 将第一个容器中的水倒入第二个容器中,倒到第二个容器的容积等于L减去步骤3中得到的容积(即L - (B-A))。此时第二个容器中的水容积为L。
- 如果第二个容器中的水容积为L,则输出成功。如果第二个容器中的水容积不为L,则输出No Solution。
这个方法的原理是基于两个容器中的水容积之和等于L升,因此可以通过反复倒水来调整两个容器中的水容积,最终得到L升的水。如果无法通过倒水得到L升的水,则说明无法使用两个容器装出L升的水。
#include <iostream>
using namespace std;
int main() {
int cup1, cup2, target;
cout << "请输入两个小杯子的容量,用空格隔开。" << endl;
cin >> cup1 >> cup2;
cout << "请输入你希望得到多少升水,整形数字。" << endl;
cin >> target;
if (cup1 > cup2) {
int tmp = cup1;
cup1 = cup2;
cup2 = tmp;
}
cout << "第二个杯子的水量为: " << 0 << endl;
// 先倒一次水,主要是为了处理倒水失败的情况
int flag = cup1 % cup2;
cout << "第二个杯子的水量为: " << cup1 << endl;
if (flag == target) {
cout << "小杯往大杯倒一次水即可实现目标" << endl;
return 0;
}
int count = 2;
while (true) {
int remain = (count * cup1) % cup2;
cout << "第二个杯子的水容量: " << remain << endl;
if (remain == target) {
cout << "倒水成功,得到了目标水量" << endl;
break;
}
else if (remain == flag) {
cout << "No Solution" << endl;
break;
}
count++;
}
return 0;
}