Advertisement
shamiul93

Agent 47

Jun 6th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | None | 0 0
  1. // LightOJ always needs this format for sure..so I made a copy of it...
  2. #include <bits/stdc++.h>
  3. #include<vector>
  4. #define ll                                      long long int
  5. #define fi                                      freopen("in.txt", "r", stdin)
  6. #define fo                                      freopen("out.txt", "w", stdout)
  7. #define m0(a) memset(a , 0 , sizeof(a))
  8. #define m1(a) memset(a , -1 , sizeof(a))
  9. #define inf LLONG_MAX
  10. #define min3(a,b,c) min(a,min(b,c))
  11. #define max3(a,b,c) max(a,max(b,c))
  12. #define ones(mask)  __builtin_popcount(mask)
  13. #define mx 150000
  14.  
  15. using namespace std;
  16.  
  17. int Set(int N,int pos)
  18. {
  19.     return N=N | (1<<pos);
  20. }
  21. int reset(int N,int pos)
  22. {
  23.     return N= N & ~(1<<pos);
  24. }
  25. bool check(int N,int pos)
  26. {
  27.     return (bool)(N & (1<<pos));
  28. }
  29.  
  30. /************************************** END OF INITIALS ****************************************/
  31.  
  32. int health[20] = {} ;
  33. int arr[20][20] = {} ;
  34. int N ;
  35.  
  36. ll dp[((1<<20)+5)] ;
  37.  
  38.  
  39. ll solve(int mask)
  40. {
  41.     if(mask == (1 << N) - 1)
  42.     {
  43.         return 0 ;
  44.     }
  45.     if(dp[mask] != -1)
  46.     {
  47.         return dp[mask] ;
  48.     }
  49.  
  50.     ll best = inf ;
  51.  
  52.     for(int i = 0 ; i < N ; i++)
  53.     {
  54.         if(!check(mask, i))
  55.         {
  56.             ll shots = 0 ;
  57.             for(int  j = 0 ; j < N ; j++)
  58.             {
  59.                 if(check(mask, j))
  60.                 {
  61.                     if(arr[i][j] != 0)
  62.                     {
  63.                         shots += ceil(health[j] / arr[i][j]) ;
  64.                     }
  65.                     else
  66.                     {
  67.                         shots += ceil(health[j] / 1) ;
  68.                     }
  69.                 }
  70.             }
  71.  
  72. //            int m = mask ;
  73. //            Set(m, i) ;
  74.             ll ret = shots + solve(Set(mask, i)) ;
  75.             best = min(best, ret) ;
  76.         }
  77.     }
  78.  
  79.     return dp[mask] = best ;
  80. }
  81.  
  82. int main()
  83. {
  84.     ll T, t = 0 ;
  85.     scanf("%lld",&T) ;
  86.  
  87.     while(T--)
  88.     {
  89.         m1(dp) ;
  90.         m0(arr);
  91.         t++ ;
  92.         scanf("%d",&N) ;
  93.         for(int i = 0 ; i < N ; i++)
  94.         {
  95.             scanf("%d",&health[i]) ;
  96.         }
  97.  
  98.         string s ;
  99.  
  100.         for(int i = 0 ; i < N ; i++)
  101.         {
  102.             cin >> s ;
  103.             for(int j = 0 ; j < s.size() ; j++)
  104.             {
  105.                 arr[i][j] = s[j] - '0' ;
  106.             }
  107.         }
  108.  
  109.         for(int i = 0 ; i < N ; i++)
  110.         {
  111.             for(int j = 0 ; j < s.size() ; j++)
  112.             {
  113.                 cout << arr[i][j] << " " ;
  114.             }
  115.             cout << endl ;
  116.         }
  117.  
  118.         int mask = 0 ;
  119.  
  120.         ll ans ;
  121.  
  122.         ans = solve(mask) ;
  123.  
  124.         printf("Case %lld: ",t) ;
  125.         cout << ans << endl  ;
  126.     }
  127.     return 0 ;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement