unlucky_13

uva_10603_Fill

May 30th, 2013
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.92 KB | None | 0 0
  1. /*
  2.  Author                             :     unlucky_13
  3.  Problem_link                       :
  4.  Category                           :
  5.  Algorithm_Used                     :
  6.  */
  7.  
  8. #include<cstdio>
  9. #include<sstream>
  10. #include<cstdlib>
  11. #include<cctype>
  12. #include<cmath>
  13. #include<algorithm>
  14. #include<set>
  15. #include<queue>
  16. #include<stack>
  17. #include<list>
  18. #include<iostream>
  19. #include<fstream>
  20. #include<numeric>
  21. #include<string>
  22. #include<vector>
  23. #include<cstring>
  24. #include<map>
  25. #include<iterator>
  26. #define LL long long int
  27. const long long int inf = 2147483647 ;
  28. //const int minx=;
  29. const int maxn=202;
  30. using namespace std;
  31. int a,b,c,d,D,diff,P;
  32. bool seen[maxn][maxn][maxn] ;
  33.  
  34. void answer(int M,int A,int B,int C) // poured water resulted water amounts of A,B,C
  35. {
  36.     //cout<<A<<" "<<B<<" "<<C<<endl ;
  37.     //if(P<M) return  ; //we can not yeld a better solution
  38.     if(A<=d && (d-A)<(diff)) { diff = d-A ; P = M  ;}
  39.     if(B<=d && (d-B)<(diff)) { diff = d-B ; P = M  ;}
  40.     if(C<=d && (d-C)<(diff)) { diff = d-C ; P = M ; }
  41.  
  42.     //cout<<P<<endl  ;
  43.  
  44. }
  45.  
  46. struct state{
  47.     int a,b,c,pour ;
  48. };
  49.  
  50. int main() {
  51.  
  52.     freopen("C:\\Users\\Mazhar\\Desktop\\Text_Files\\in.txt", "r", stdin);
  53.  
  54.     int tc ;
  55.     queue<state>q ;
  56.     state Q ;
  57.     scanf("%d",&tc) ;
  58.     while(tc--)
  59.     {
  60.         diff = P = inf ;
  61.         memset(seen,0,sizeof(seen)) ;
  62.         scanf("%d %d %d %d",&a,&b,&c,&d) ;
  63.         Q.a = Q.b = Q.pour = 0  ;
  64.         Q.c = c ;
  65.         seen[0][0][c] = 1 ;
  66.         q.push(Q) ;
  67.         while(!q.empty())
  68.         {
  69.             Q = q.front() ;
  70.             q.pop() ;
  71.             int A = Q.a ;
  72.             int B = Q.b ;
  73.             int C = Q.c ;
  74.             int pour = Q.pour ;
  75.             if(diff==0) {
  76.                 while(!q.empty()) q.pop() ;
  77.                 //P = Q.pour ;
  78.                 break ;
  79.             }
  80.             int AA ,BB,CC ;
  81.             //cout<<A<<" "<<B<<" "<<C<<Q.pour<<endl ;
  82.             //a->b
  83.  
  84.             BB = B+A ;
  85.             AA  = 0 ;
  86.             CC = C ;
  87.             if(BB>b) { //B is overflowed
  88.                 AA = BB-b ;
  89.                 BB = b ;
  90.  
  91.             }
  92.  
  93.             if(seen[AA][BB][CC]==0)
  94.             {
  95.                 seen[AA][BB][CC]= 1 ;
  96.                 Q.a = AA ;
  97.                 Q.b = BB ;
  98.                 Q.c = CC ;
  99.                 Q.pour = pour+(BB-B) ;
  100.                 q.push(Q) ;
  101.                 answer(Q.pour,AA,BB,CC) ;
  102.  
  103.             }
  104.             //b->a
  105.             AA = B+A ;
  106.             BB = 0 ;
  107.             CC = C ;
  108.             if(AA>a) { //A is overflowed
  109.                 BB = AA-a ;
  110.                 AA = a ;
  111.  
  112.             }
  113.             if(seen[AA][BB][CC]==0)
  114.             {
  115.                 seen[AA][BB][CC]= 1 ;
  116.                 Q.a = AA ;
  117.                 Q.b = BB ;
  118.                 Q.c = CC ;
  119.                 Q.pour = pour+(AA-A) ;
  120.                 q.push(Q) ;
  121.                 answer(Q.pour,AA,BB,CC) ;
  122.  
  123.  
  124.             }
  125.             //b->c
  126.             CC = C+B ;
  127.             BB = 0 ;
  128.             AA = A ;
  129.             if(CC>c) { //C is overflowed
  130.                 BB = CC-c ;
  131.                 CC = c ;
  132.             }
  133.  
  134.             if(seen[AA][BB][CC]==0)
  135.             {
  136.                 seen[AA][BB][CC]= 1 ;
  137.                 Q.a = AA ;
  138.                 Q.b = BB ;
  139.                 Q.c = CC ;
  140.                 Q.pour = pour+(CC-C) ;
  141.                 q.push(Q) ;
  142.                 answer(Q.pour,AA,BB,CC) ;
  143.  
  144.             }
  145.             //c->b
  146.             BB = B+C ;
  147.             CC = 0 ;
  148.             AA = A ;
  149.             if(BB>b){
  150.                 CC = BB-b ;
  151.                 BB = b ;
  152.             }
  153.  
  154.             if(seen[AA][BB][CC]==0)
  155.             {
  156.                 seen[AA][BB][CC]= 1 ;
  157.                 Q.a = AA ;
  158.                 Q.b = BB ;
  159.                 Q.c = CC ;
  160.                 Q.pour = pour+BB-B ;
  161.                 q.push(Q) ;
  162.                 answer(Q.pour,AA,BB,CC) ;
  163.             }
  164.             //a->c
  165.             CC = A+C ;
  166.             AA = 0 ;
  167.             BB = B ;
  168.             if(CC>c){
  169.                 AA = CC-c ;
  170.                 CC = c ;
  171.             }
  172.             if(seen[AA][BB][CC]==0)
  173.             {
  174.                 seen[AA][BB][CC]= 1 ;
  175.                 Q.a = AA ;
  176.                 Q.b = BB ;
  177.                 Q.c = CC ;
  178.                 Q.pour = pour+CC-C ;
  179.                 q.push(Q) ;
  180.                 answer(Q.pour,AA,BB,CC) ;
  181.             }
  182.             //c->a
  183.             AA = C+A ;
  184.             CC =  0 ;
  185.             BB = B ;
  186.             if(AA>a){
  187.                 CC = AA-a ;
  188.                 AA = a ;
  189.             }
  190.             if(seen[AA][BB][CC]==0)
  191.             {
  192.                 seen[AA][BB][CC]= 1 ;
  193.                 Q.a = AA ;
  194.                 Q.b = BB ;
  195.                 Q.c = CC ;
  196.                 Q.pour = pour+AA-A ;
  197.                 q.push(Q) ;
  198.                 answer(Q.pour,AA,BB,CC) ;
  199.             }
  200.  
  201.  
  202.  
  203.  
  204.  
  205.         }
  206.        // cout<<diff<<endl ;
  207.         cout<<P<<" "<<d-diff<<endl ;
  208.  
  209.     }
  210.  
  211.     return 0;
  212.  
  213. }
Advertisement
Add Comment
Please, Sign In to add comment