gt22

Untitled

Oct 3rd, 2019
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <vector>
  2. #include "optimization.h"
  3. #include <cmath>
  4. using namespace std;
  5. typedef pair<int, int> pii;
  6.  
  7. vector<pii> a;
  8. vector<pair<double, int>> ans;
  9. vector<double> scaledVector;
  10. int partition(int l, int r, int pI) {
  11.     int pivot = scaledVector[pI];
  12.     swap(scaledVector[pI], scaledVector[r]);
  13.     int store = l;
  14.     for (int i = l; i < r; ++i) {
  15.         if(scaledVector[i] < pivot) {
  16.             swap(scaledVector[i], scaledVector[store++]);
  17.         }
  18.     }
  19.     swap(scaledVector[r], scaledVector[store]);
  20.     return store;
  21. }
  22.  
  23. int partition_ans(int l, int r, int pI) {
  24.     int pivot = ans[pI].first;
  25.     swap(ans[pI], ans[r]);
  26.     int store = l;
  27.     for (int i = l; i < r; ++i) {
  28.         if(ans[i].first < pivot) {
  29.             swap(ans[i], ans[store++]);
  30.         }
  31.     }
  32.     swap(ans[r], ans[store]);
  33.     return store;
  34. }
  35.  
  36. int select(int l, int r, int k, int (*part)(int, int, int)) {
  37.     if(l == r) return l;
  38. //    int pI = (l+r)/2;
  39.     int pI = l + ((int) floor(rand() % (r - l)));
  40.     pI = part(l, r, pI);
  41.     if(pI == k) {
  42.         return pI;
  43.     } else if(pI < k) {
  44.         return select(pI + 1, r, k - pI, part);
  45.     } else {
  46.         return select(l, pI - 1, k, part);
  47.     }
  48. }
  49.  
  50. int main() {
  51.     int n = readInt(), k = readInt();
  52.     a.resize(n);
  53.     scaledVector.resize(n);
  54.     for (int i = 0; i < n; ++i) {
  55.         a[i] = make_pair(readInt(), readInt());
  56.     }
  57.     double l = 0, r = 1e7;
  58.  
  59.     for (int kk = 0; kk < 100000; ++kk) {
  60.         double m = (l + r) / 2;
  61.         for (int i = 0; i < n; ++i) {
  62.             pii x = a[i];
  63.             scaledVector[i] = x.first - m * x.second;
  64.         }
  65.         int pI = select(0, n-1, k-1, &partition);
  66.         double sum = 0;
  67.         for (int i = pI; i < n; ++i) {
  68.             sum += scaledVector[i];
  69.         }
  70.         if(sum >= 0) {
  71.             l = m;
  72.         } else {
  73.             r = m;
  74.         }
  75.     }
  76.     ans.resize(n);
  77.     for (int i = 0; i < n; ++i) {
  78.         pii x = a[i];
  79.         ans[i] = make_pair(x.first - l * x.second, i);
  80.     }
  81. //    int ansPi = select(0, n, k-1, &partition_ans);
  82.     sort(ans.begin(), ans.end());
  83.     for (int i = 0; i < k; ++i) {
  84.          writeInt(ans[n-i-1].second + 1, ' ');
  85.     }
  86.     writeChar('\n');
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment