#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
struct Node
{
int v[3];
int num;
friend bool operator<(const Node& a, const Node& b) {
return a.num > b.num;
}
}start, base;
const int maxn = 207;
int vis[maxn][maxn], ans[maxn];
int main()
{
priority_queue<Node> q;
int n,d;
cin >> n;
while (n--) {
while (!q.empty()) q.pop();
memset(&start, 0, sizeof(start));
memset(ans, -1, sizeof(ans));
memset(vis, 0, sizeof(vis));
vis[0][0] = 1;
cin >> base.v[0] >> base.v[1] >> base.v[2] >> d;
start.v[2] = base.v[2];
q.push(start);
while (!q.empty()) {
Node t = q.top();
q.pop();
for (int i = 0; i < 3; i++) {
int tv = t.v[i];
if (ans[tv] == -1 || t.num < ans[tv]) ans[tv] = t.num;
}
if (ans[d] >= 0) break;
for (int i = 0; i < 3; i++) {
//i被掏空了
if (t.v[i] == 0) continue;
for (int j = 0; j < 3; j++) {
if (i == j || t.v[j] == base.v[j]) continue;
//i 往 j 里面倒水 i倒完 或者 j倒满
int water = min(t.v[i], base.v[j] - t.v[j]);
Node temp = t;
temp.v[i] -= water;
temp.v[j] += water;
if (vis[temp.v[0]][temp.v[1]]) continue;
temp.num += water;
vis[temp.v[0]][temp.v[1]] = 1;
q.push(temp);
}
}
}
while (d >= 0) {
if (ans[d] >= 0) {
cout << ans[d] << " " << d << endl;
break;
}
d--;
}
}
return 0;
}
07-15
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交