orazma

c.cpp

May 28th, 2026
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.25 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define f first
  3. #define s second
  4. #define pb push_back
  5. #define mp make_pair
  6. #define ll long long
  7.  
  8. #define IOS ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
  9.  
  10. using namespace std;
  11. const int INF = 1e9 + 1;
  12. const int MOD = 1e9 + 7;
  13. const int MAXN = 1e6 + 10;
  14. char c[MAXN];
  15. int r[MAXN], b[MAXN];
  16. int dp[70000][2][270];
  17. void solve(){
  18.     int n;
  19.     cin >> n;
  20.     int cntR = 0;
  21.     int cntB = 0;
  22.     for (int i = 0; i < n; i++){
  23.         cin >> c[i] >> r[i] >> b[i];
  24.         int cnt = max(0, max(r[i] - n, b[i] - n));
  25.         cntR += max(0, r[i] - max(0, (r[i] - cnt)));
  26.         cntB += max(0, b[i] - max(0, (b[i] - cnt)));
  27.         r[i] = max(0, r[i] - cnt);
  28.         b[i] = max(0, b[i] - cnt);
  29.     }
  30.     for (int mask = 0; mask < (1 << n); mask++){
  31.         for (int i = 0; i <= 1; i++){
  32.             for (int j = 0; j <= 256; j++){
  33.                 dp[mask][i][j] = INF;
  34.             }
  35.         }
  36.     }
  37.     if (cntR >= cntB){
  38.         dp[0][1][min(cntR - cntB, 256)] = max(cntR, cntB);
  39.     }
  40.     if (cntR <= cntB){
  41.         dp[0][0][min(cntB - cntR, 256)] = max(cntR, cntB);
  42.     }
  43.  
  44.     for (int mask = 0; mask < (1 << n); mask++){
  45.         int A = 0, B = 0;
  46.         for (int i = 0; i < n; i++){
  47.             if ((mask >> i) & 1){
  48.                 if (c[i] == 'R'){
  49.                     A++;
  50.                 }
  51.                 else{
  52.                     B++;
  53.                 }
  54.             }
  55.         }
  56.         int ri, bi, cost, cR, cB;
  57.         for (int i = 0; i < n; i++){
  58.             if (((mask >> i) & 1) == 0){
  59.                 for (int j = 0; j <= 1; j++){
  60.                     for (int k = 0; k <= 256; k++){
  61.                         if (dp[mask][j][k] < INF){
  62.                             ri = max(r[i] - A, 0);
  63.                             bi = max(b[i] - B, 0);
  64.                             cost = 0;
  65.                             cR = 0;
  66.                             cB = 0;
  67.                             if (j == 0){
  68.                                 cB = k;
  69.                             }
  70.                             else{
  71.                                 cR = k;
  72.                             }
  73.                             int tmp = max(0, max(ri - cR, bi - cB));
  74.                             cR = cR + tmp - ri;
  75.                             cB = cB + tmp - bi;
  76.                             cost += tmp;
  77.                             if (cR == 0){
  78.                                 dp[mask | (1 << i)][0][cB] = min(dp[mask | (1 << i)][0][cB],
  79.                                                                  dp[mask][j][k] + cost + 1);
  80.                             }
  81.                             if (cB == 0){
  82.                                 dp[mask | (1 << i)][1][cR] = min(dp[mask | (1 << i)][1][cR],
  83.                                                                  dp[mask][j][k] + cost + 1);
  84.                             }
  85.                         }
  86.                     }
  87.                 }
  88.             }
  89.         }
  90.  
  91.  
  92.     }
  93.     int ans = INF;
  94.     for (int i = 0; i <= 1; i++){
  95.         for (int j = 0; j <= 256; j++){
  96.             ans = min(ans, dp[(1 << n) - 1][i][j]);
  97.         }
  98.     }
  99.     cout << ans;
  100.  
  101. }
  102.  
  103. int main() {
  104.     IOS;
  105.     int t = 1;
  106.     //cin >> t;
  107.     while(t--){
  108.         solve();
  109.     }
  110.     return 0;
  111. }
  112.  
Advertisement
Add Comment
Please, Sign In to add comment