Advertisement
_no0B

Untitled

Nov 13th, 2021
1,036
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define N ((int)6e4 + 5)
  4. #define MOD ((int)1e9 + 7)
  5. #define MAX ((int)1e9 + 7)
  6. #define MAXL ((ll)1e18 + 7)
  7. #define MAXP ((int)1e3 + 7)
  8. #define thr 1e-8
  9. #define pi acos(-1)  /// pi = acos ( -1 )
  10. #define fastio ios_base::sync_with_stdio(false),cin.tie(NULL)
  11. #define endl "\n"
  12.  
  13. using namespace std;
  14.  
  15. int arr[22][22] , dpp[2 + (1<<15)] , health[20] ,n;
  16.  
  17. int solve(int mask) /// mask = 101100 , newMask = 100100, nxt[mask] = newMask
  18. {
  19.     if(mask == 0) return 0;
  20.     if(dpp[mask] != -1) return dpp[mask];
  21.     int ans = MAX;
  22.  
  23.     for(int i = 0 ; i < n ; i++)
  24.     {
  25.         if(mask & (1<<i))
  26.         {
  27.             ans = min(ans, solve(mask ^ (1<<i)) + health[i]);
  28.             for(int j = 0 ; j < n ; j++)
  29.             {
  30.                 int damage = arr[j][i];
  31.                 if((mask & (1<<j)) == 0 && damage > 0)
  32.                 {
  33.                     int shots = (health[i] + damage - 1) / damage;
  34.                     ans = min(ans, solve(mask ^ (1<<i)) +  shots);
  35.                 }
  36.             }
  37.         }
  38.  
  39.     }
  40.  
  41.     return dpp[mask] = ans;
  42. }
  43.  
  44. /// state: O(2^n);
  45. /// time complexity: O(2^n * n * n)
  46.  
  47.  
  48. void print(int mask) /// mask = 01110110
  49. {
  50.     if(mask == 0) return;
  51.     int ans = solve(mask);
  52.     for(int i = 0 ; i < n ; i++) /// i = 2
  53.     {
  54.         if(mask & (1<<i))
  55.         {
  56.             int bestAns = solve(mask ^ (1<<i)) + health[i];
  57.             if(bestAns == ans){
  58.                 cout<<i<<" My Gun\n";
  59.                 print(mask ^ (1<<i));
  60.                 return;
  61.             }
  62.             for(int j = 0 ; j < n ; j++)
  63.             {
  64.                 int damage = arr[j][i];
  65.                 if((mask & (1<<j)) == 0 && damage > 0)
  66.                 {
  67.                     int shots = (health[i] + damage - 1) / damage;
  68.                     int bestAns = solve(mask ^ (1<<i)) +  shots;
  69.                     if(ans == bestAns){
  70.                         cout<<i<<" Gun: "<<j<<endl;
  71.                         print(mask ^ (1<<i));
  72.                         return ;
  73.                     }
  74.                 }
  75.             }
  76.         }
  77.  
  78.     }
  79. }
  80.  
  81. /// O ( n * n * n )
  82.  
  83. int main()
  84. {
  85.     /// problem: https://lightoj.com/problem/agent-47
  86. //    int n;
  87.     cin>>n;
  88.     for(int i = 0 ; i < n ; i++) cin>>health[i];
  89.     for(int i = 0 ; i < n ; i++){
  90.         string str;
  91.         cin>>str;
  92.         for(int j = 0 ; j < n ; j++) arr[i][j] = str[j] - '0';
  93.     }
  94.     memset(dpp,-1,sizeof dpp);
  95.     cout<<solve((1<<n) - 1)<<endl;
  96.  
  97.     print((1<<n) - 1);
  98.  
  99.  
  100. }
  101.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement