Dang_Quan_10_Tin

TACKE

Aug 12th, 2020
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <vector>
  5. #define task "TACKE"
  6. using namespace std;
  7. using ll = long long;
  8. using ld = long double;
  9.  
  10. const int N = 1e3 + 2;
  11. int n, k, m, v;
  12. const ll Inf = 1e18;
  13. ll dp[N][N][2];
  14. ll a[N];
  15. vector<int> pos[N], s;
  16.  
  17. void Read(){
  18.     cin >> n >> k;
  19.     for(int i = 1; i <= n; ++i)
  20.         cin >> a[i];
  21.     for(int i = 1; i <= n; ++i)
  22.         cin >> v,
  23.         pos[v].push_back(i),
  24.         s.push_back(v);
  25.     sort(s.begin(), s.end());
  26.     s.resize(unique(s.begin(), s.end()) - s.begin());
  27.     for(int i = 0; i < s.size(); ++i)
  28.         swap(pos[i + 1], pos[s[i]]);
  29.     m = s.size();
  30.     for(int i = 1; i <= m; ++i)
  31.         sort(pos[i].begin(), pos[i].end(), [&](int &x, int &y){return a[x] < a[y];});
  32. }
  33.  
  34. void Destroy(){
  35.     for(int i = 1; i <= m; ++i)
  36.         pos[i].clear();
  37.     s.clear();
  38. }
  39.  
  40. /// f(i, j, t) : đến màu thứ i đã bắt được chính xác j con vịt và (t == 1 ? đã bắt con cuối : chưa bắt con cuối)
  41. /// TH1 : Không chọn màu i : f(i, j, t) = f(i - 1, j, t)
  42. /// TH2 : Chọn màu i:
  43. ///     a - Không chọn i làm cuối : f(i, j, t) = min(f(i - 1, j - h, t) + 2 * a[pos[i][h - 1]]) với mọi h
  44. ///     b - Chọn i làm cuối : f(i, j, 1) = min(f(i - 1, j - h, 0) + a[pos[i][h - 1]]) với mọi h
  45.  
  46. ll &f(int x, int y, int z){
  47.     return dp[x][y][z];
  48. }
  49.  
  50. void Solve(){
  51.     fill_n(&dp[0][0][0], 2 * N * N, Inf);
  52.     dp[0][0][0] = 0;
  53.     for(int i = 1; i <= m; ++i)
  54.         for(int j = 0; j <= k; ++j){
  55.             /// TH1
  56.             f(i, j, 0) = f(i - 1, j, 0);
  57.             f(i, j, 1) = f(i - 1, j, 1);
  58.             ///TH2
  59.             for(int h = 1; h <= min(j, (int)pos[i].size()); ++h){
  60.                 //a
  61.                 f(i, j, 0) = min(f(i, j, 0), f(i - 1, j - h, 0) + 2 * a[pos[i][h - 1]]);
  62.                 f(i, j, 1) = min(f(i, j, 1), f(i - 1, j - h, 1) + 2 * a[pos[i][h - 1]]);
  63.                 //b
  64.                 f(i, j, 1) = min(f(i, j, 1), f(i - 1, j - h, 0) + a[pos[i][h - 1]]);
  65.             }
  66.         }
  67.     cout << f(m, k, 1) << "\n";
  68. }
  69.  
  70. int32_t main(){
  71.     ios::sync_with_stdio(0);
  72.     cin.tie(0);
  73.     cout.tie(0); if(fopen(task".INP", "r"))
  74.     freopen(task".INP", "r", stdin),
  75.     freopen(task".ANS", "w", stdout);
  76.     int t;
  77.     cin >> t;
  78.     while(t--)
  79.         Read(),
  80.         Solve(),
  81.         Destroy();
  82. }
  83.  
Add Comment
Please, Sign In to add comment