Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include "optimization.h"
- #include <cmath>
- using namespace std;
- typedef pair<int, int> pii;
- vector<pii> a;
- vector<pair<double, int>> ans;
- vector<double> scaledVector;
- int partition(int l, int r, int pI) {
- int pivot = scaledVector[pI];
- swap(scaledVector[pI], scaledVector[r]);
- int store = l;
- for (int i = l; i < r; ++i) {
- if(scaledVector[i] < pivot) {
- swap(scaledVector[i], scaledVector[store++]);
- }
- }
- swap(scaledVector[r], scaledVector[store]);
- return store;
- }
- int partition_ans(int l, int r, int pI) {
- int pivot = ans[pI].first;
- swap(ans[pI], ans[r]);
- int store = l;
- for (int i = l; i < r; ++i) {
- if(ans[i].first < pivot) {
- swap(ans[i], ans[store++]);
- }
- }
- swap(ans[r], ans[store]);
- return store;
- }
- int select(int l, int r, int k, int (*part)(int, int, int)) {
- if(l == r) return l;
- // int pI = (l+r)/2;
- int pI = l + ((int) floor(rand() % (r - l)));
- pI = part(l, r, pI);
- if(pI == k) {
- return pI;
- } else if(pI < k) {
- return select(pI + 1, r, k - pI, part);
- } else {
- return select(l, pI - 1, k, part);
- }
- }
- int main() {
- int n = readInt(), k = readInt();
- a.resize(n);
- scaledVector.resize(n);
- for (int i = 0; i < n; ++i) {
- a[i] = make_pair(readInt(), readInt());
- }
- double l = 0, r = 1e7;
- for (int kk = 0; kk < 100000; ++kk) {
- double m = (l + r) / 2;
- for (int i = 0; i < n; ++i) {
- pii x = a[i];
- scaledVector[i] = x.first - m * x.second;
- }
- int pI = select(0, n-1, k-1, &partition);
- double sum = 0;
- for (int i = pI; i < n; ++i) {
- sum += scaledVector[i];
- }
- if(sum >= 0) {
- l = m;
- } else {
- r = m;
- }
- }
- ans.resize(n);
- for (int i = 0; i < n; ++i) {
- pii x = a[i];
- ans[i] = make_pair(x.first - l * x.second, i);
- }
- // int ansPi = select(0, n, k-1, &partition_ans);
- sort(ans.begin(), ans.end());
- for (int i = 0; i < k; ++i) {
- writeInt(ans[n-i-1].second + 1, ' ');
- }
- writeChar('\n');
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment