#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<queue> #include<vector> #include<sstream> #include<cmath> #include<queue> using namespace std; const int maxn = 200 + 10; int v[3], d, dis[maxn]; bool visit[maxn][maxn]; struct node{ int v[3], dist; bool operator < (const node &rhs) const{ return dist > rhs.dist; } }; void update(node u){ int dist = u.dist; for(int i = 0; i < 3; i++){ if(dis[u.v[i]]<0 || dis[u.v[i]] > dist) dis[u.v[i]] = dist; } } void solve(){ priority_queue<node>q; q.push({0,0,v[2],0}); memset(dis,-1,sizeof(dis)); memset(visit,false,sizeof(visit)); visit[0][0] = true; while(!q.empty()){ node s = q.top(); update(s); if(dis[d]>=0) break; q.pop(); for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) if(i == j) continue; else{ node t = s; int water = min(v[j]-t.v[j],t.v[i]); t.v[i] -= water; t.v[j] += water; t.dist += water; if(visit[t.v[0]][t.v[1]]) continue; visit[t.v[0]][t.v[1]] = true; q.push(t); } } if(dis[d] >= 0) printf("%d %d\n",dis[d],d); else for(int i = d-1;;i--){ if(dis[i] >= 0) { printf("%d %d\n",dis[i],i); break; } } } int main(){ int T; scanf("%d",&T); while(T--){ for(int i = 0; i < 3; i++) scanf("%d",&v[i]); scanf("%d",&d); solve(); } return 0; }
uva 10603
猜你喜欢
转载自blog.csdn.net/a874288174/article/details/79912307
今日推荐
周排行