Advertisement
erek1e

IOI '09 P2 - Hiring

Jun 22nd, 2022
737
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <queue>
  5.  
  6. using namespace std;
  7.  
  8. int main() {
  9.     int n;
  10.     long long w;
  11.     cin >> n >> w;
  12.     vector<int> s(n), q(n);
  13.     for (int i = 0; i < n; ++i) cin >> s[i] >> q[i];
  14.  
  15.     vector<int> v(n);
  16.     for (int i = 0; i < n; ++i) v[i] = i;
  17.     sort(v.begin(), v.end(), [&s, &q](int i, int j) {
  18.         return s[i]*q[j] < s[j]*q[i];
  19.     });
  20.  
  21.     int maxWorkers = 0, lastWorker = 0;
  22.     long long minPayN = w+1, minPayD = 1; // numerator, denominator
  23.  
  24.     priority_queue<pair<int, int>> pq;
  25.     long long qSum = 0; int curWorkers = 0;
  26.     for (int p = 0; p < n; ++p) {
  27.         int i = v[p];
  28.         long long targetN = w*q[i], targetD = s[i]; // numerator, denominator
  29.         pq.emplace(q[i], i);
  30.         qSum += q[i];
  31.         ++curWorkers;
  32.         while (qSum*targetD > targetN) {
  33.             qSum -= pq.top().first;
  34.             pq.pop();
  35.             --curWorkers;
  36.         }
  37.         long long payN = s[i]*qSum, payD = q[i]; // numerator, denominator
  38.         if (curWorkers > maxWorkers || curWorkers == maxWorkers && payN*minPayD < minPayN*payD) {
  39.             maxWorkers = curWorkers;
  40.             lastWorker = p;
  41.             minPayN = payN, minPayD = payD;
  42.         }
  43.     }
  44.  
  45.     cout << maxWorkers << endl;
  46.     sort(v.begin(), v.begin()+lastWorker+1, [&q](int i, int j) {
  47.         return q[i] < q[j];
  48.     });
  49.     for (int i = 0; i < maxWorkers; ++i) cout << v[i]+1 << endl;
  50.     cout << endl;
  51.     return 0;
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement