Advertisement
tepyotin2

P85_Rental

Aug 2nd, 2023
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. bool isDiag = false;
  5.  
  6.  
  7. struct Store{
  8.     int q, p;
  9.     Store(){};
  10.     Store(int q, int p):q(q), p(p){};
  11. };
  12. int cows[100001];
  13. Store stores[100001];
  14. int rents[100001];
  15.  
  16. int main(){
  17.     //isDiag = true;
  18.     freopen(  "rental.in", "r", stdin);
  19.    
  20.    
  21.     long long ans = 0; 
  22.     int N, M, R ;
  23.     cin >> N  >> M >> R;
  24.     for (int i = 1; i <= N; i++) cin >> cows[i];
  25.     for (int i = 1; i <= M; i++) cin >> stores[i].q >> stores[i].p;
  26.     for (int i = 1; i <= R; i++) cin >> rents[i];
  27.    
  28.     sort(cows+1, cows+1+N, greater<int>());
  29.     sort(stores+1, stores+1+M, [&](Store a, Store b){
  30.         return a.p > b.p;
  31.     });
  32.     sort(rents+1, rents+1+R, greater<int>());
  33.     if (isDiag)
  34.     {
  35.         for (int i = 1; i <= N; i++) cout << "cows: " << cows[i] << endl;
  36.         for (int i = 1; i <= M; i++) cout << "stores p: " << stores[i].p << ", q: " << stores[i].q<< endl;
  37.         for (int i = 1; i <= R; i++) cout << "rents: " << rents[i]<< endl;
  38.     }
  39.     int ci = 1, si = 1, ri = 1;
  40.     while (ci <= N)
  41.     {
  42.         int money = 0;
  43.         int milk = cows[ci];
  44.         int tsi = si;
  45.         int r_milk;
  46.         while (tsi <= M)
  47.         {
  48.             int a_milk =    min(stores[tsi].q, milk);
  49.             money += a_milk * stores[tsi].p;
  50.             milk -= a_milk;
  51.             if (milk == 0)
  52.             {
  53.                 r_milk = a_milk;
  54.                 break;
  55.             }else
  56.             {
  57.                 tsi++;
  58.             }
  59.         }
  60.        
  61.         if (ri > R || money > rents[ri])
  62.         {
  63.             // sell to store
  64.             ans += money;
  65.             si = tsi;
  66.             if(si <= M) stores[si].q -= r_milk;
  67.             ci++;
  68.         }else
  69.         {
  70.             ans += rents[ri++];
  71.             N--; // release less productive cow to rent
  72.         }
  73.    
  74.     }
  75.    
  76.     if(!isDiag) freopen("rental.out", "w", stdout);
  77.     cout << ans << endl;
  78. }
  79.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement