Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <vector>
- using namespace std;
- struct Jewel {
- int price;
- int weight;
- };
- int n, k;
- Jewel js[2000000];
- pair<long long, long long> pickLinear(long long s, long long w, int start,
- int end) {
- int bestJ = start;
- long long sBest = s + js[start].price;
- long long wBest = w + js[start].weight;
- // printf("%lf ", sBest / wBest);
- for (int j = start + 1; j <= end; j++) {
- double v = ((double)(s + js[j].price)) / (w + js[j].weight);
- if (v > ((double)sBest) / wBest) {
- sBest = s + js[j].price;
- wBest = w + js[j].weight;
- bestJ = j;
- }
- // printf("%lf ", v);
- }
- // puts("");
- swap(js[n - 1], js[bestJ]);
- n--;
- return {sBest, wBest};
- }
- pair<long long, long long> pick(double s, double w) {
- int lo = 0;
- int hi = n - 1;
- int bestJ;
- long long sBest;
- long long wBest;
- while (lo <= hi) {
- int mid = (lo + hi) / 2;
- double v = ((double)(s + js[mid].price)) / (w + js[mid].weight);
- // cout << lo << ' ' << hi << '\n';
- // for (int i = lo; i <= hi; i++) {
- // printf("%lf ", (s + js[i].price) / (w + js[i].weight));
- // }
- // puts("");
- if (hi - lo <= 100) {
- return pickLinear(s, w, lo, hi);
- }
- double prevV =
- ((double)(s + js[mid - 1].price)) / (w + js[mid - 1].weight);
- double nextV =
- ((double)(s + js[mid + 1].price)) / (w + js[mid + 1].weight);
- if (prevV <= v && v >= nextV) {
- bestJ = mid;
- sBest = s + js[mid].price;
- wBest = w + js[mid].price;
- break;
- } else if (prevV > v) {
- hi = mid;
- } else {
- lo = mid;
- }
- }
- swap(js[n - 1], js[bestJ]);
- n--;
- return {sBest, wBest};
- }
- long long solve() {
- long long s = 0;
- long long w = 0;
- int size = n;
- // sort(js.begin(), js.end(), [](const Jewel &a, const Jewel &b) {
- sort(js, js + n, [](const Jewel &a, const Jewel &b) {
- return (((double)a.price) / a.weight > ((double)b.price) / b.weight)
- ||
- a.price > b.price;
- });
- puts("Sorted");
- if (k > n) {
- return 0;
- }
- if (k == n) {
- for (Jewel &b : js) {
- s += b.price;
- }
- return s;
- }
- for (int i = 0; i < k; i++) {
- pair<long long, long long> picked = pick(s, w);
- s = picked.first;
- w = picked.second;
- }
- return s;
- }
- int main() {
- scanf("%d%d", &n, &k);
- // js.resize(n);
- for (int i = 0; i < n; i++) {
- Jewel &j = js[i];
- scanf("%d%d", &j.price, &j.weight);
- }
- // puts("Done reading");
- long long res = solve();
- printf("%lld", res);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement