uva 10603

#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;
}

猜你喜欢

转载自blog.csdn.net/a874288174/article/details/79912307