总体思路与经典的倒水问题相同(可参考刘汝佳《算法竞赛入门经典》P202-P205对Uva10603的讲解)
对于总可乐量为奇数的情况,直接输出不可能,因为对于没有刻度的整数容量的杯子,我们可以操作的最小可乐量不会小于1,因而无法平分。
下面讨论偶数的情况:
把每种状态以三个杯子中的水量排成的有序三元组表示,该三元组可看成有向图中的一个节点。如果经过一次倾倒,状态A转移成了状态B,那么在图中就有一条从A指向B的边。
我们从图中的(S,0,0)点出发,寻找两个杯子中各有总可乐量的一半的状态,即为搜索的终点。
(其实这一点题目说的有些含糊,因为题目只问了两个人能不能平分,其实平分可乐并不需要两个杯子中各有一半,比如第一组测试数据的4 1 3这种情况,起点是4 0 0,第一步从第一个往第三个倒 得到 1 0 3,第二步从第三个往第二个倒,得到 1 1 2,这样一个人喝第三杯,另一个喝第一第二杯,所以只倒两次就可以,这种理解终点的条件应该是至少有一个杯子中的可乐量时总量的一半,但是根据样例的数据,题目并不是这个意思,所以理解题目还是要靠数据啊23333)
对于这样的图上的最短路问题,我们应该使用BFS。
代码如下(该题还有数论做法,性能上由碾压优势,有兴趣的同学可以去网上学习一下)
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct sta
{
int coke