Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. struct Jewel {
  8.     int price;
  9.     int weight;
  10. };
  11.  
  12. int n, k;
  13. Jewel js[2000000];
  14.  
  15. pair<long long, long long> pickLinear(long long s, long long w, int start,
  16.                                       int end) {
  17.     int bestJ = start;
  18.     long long sBest = s + js[start].price;
  19.     long long wBest = w + js[start].weight;
  20.  
  21.     // printf("%lf ", sBest / wBest);
  22.     for (int j = start + 1; j <= end; j++) {
  23.         double v = ((double)(s + js[j].price)) / (w + js[j].weight);
  24.  
  25.         if (v > ((double)sBest) / wBest) {
  26.             sBest = s + js[j].price;
  27.             wBest = w + js[j].weight;
  28.             bestJ = j;
  29.         }
  30.  
  31.         // printf("%lf ", v);
  32.     }
  33.     // puts("");
  34.  
  35.     swap(js[n - 1], js[bestJ]);
  36.     n--;
  37.  
  38.     return {sBest, wBest};
  39. }
  40.  
  41. pair<long long, long long> pick(double s, double w) {
  42.     int lo = 0;
  43.     int hi = n - 1;
  44.  
  45.     int bestJ;
  46.     long long sBest;
  47.     long long wBest;
  48.  
  49.     while (lo <= hi) {
  50.         int mid = (lo + hi) / 2;
  51.         double v = ((double)(s + js[mid].price)) / (w + js[mid].weight);
  52.  
  53.         // cout << lo << ' ' << hi << '\n';
  54.  
  55.         // for (int i = lo; i <= hi; i++) {
  56.         //     printf("%lf ", (s + js[i].price) / (w + js[i].weight));
  57.         // }
  58.         // puts("");
  59.  
  60.         if (hi - lo <= 100) {
  61.             return pickLinear(s, w, lo, hi);
  62.         }
  63.  
  64.         double prevV =
  65.             ((double)(s + js[mid - 1].price)) / (w + js[mid - 1].weight);
  66.         double nextV =
  67.             ((double)(s + js[mid + 1].price)) / (w + js[mid + 1].weight);
  68.         if (prevV <= v && v >= nextV) {
  69.             bestJ = mid;
  70.             sBest = s + js[mid].price;
  71.             wBest = w + js[mid].price;
  72.             break;
  73.         } else if (prevV > v) {
  74.             hi = mid;
  75.         } else {
  76.             lo = mid;
  77.         }
  78.     }
  79.  
  80.     swap(js[n - 1], js[bestJ]);
  81.     n--;
  82.  
  83.     return {sBest, wBest};
  84. }
  85.  
  86. long long solve() {
  87.     long long s = 0;
  88.     long long w = 0;
  89.     int size = n;
  90.  
  91.     // sort(js.begin(), js.end(), [](const Jewel &a, const Jewel &b) {
  92.     sort(js, js + n, [](const Jewel &a, const Jewel &b) {
  93.         return (((double)a.price) / a.weight > ((double)b.price) / b.weight)
  94.         ||
  95.                a.price > b.price;
  96.     });
  97.  
  98.     puts("Sorted");
  99.  
  100.     if (k > n) {
  101.         return 0;
  102.     }
  103.  
  104.     if (k == n) {
  105.         for (Jewel &b : js) {
  106.             s += b.price;
  107.         }
  108.         return s;
  109.     }
  110.  
  111.     for (int i = 0; i < k; i++) {
  112.         pair<long long, long long> picked = pick(s, w);
  113.         s = picked.first;
  114.         w = picked.second;
  115.     }
  116.  
  117.     return s;
  118. }
  119.  
  120. int main() {
  121.     scanf("%d%d", &n, &k);
  122.  
  123.     // js.resize(n);
  124.     for (int i = 0; i < n; i++) {
  125.         Jewel &j = js[i];
  126.         scanf("%d%d", &j.price, &j.weight);
  127.     }
  128.  
  129.     // puts("Done reading");
  130.  
  131.     long long res = solve();
  132.     printf("%lld", res);
  133.  
  134.     return 0;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement