Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- void QuickSort(int l, int r, double* mas, int* cnt) {
- if (r - l < 1) return;
- double x = mas[(l + r) / 2];
- int i = l, j = r;
- //cout << x << endl;
- while (i <= j) {
- while (mas[i] < x) i++;
- while (mas[j] > x) j--;
- if (i <= j) {
- swap (mas[i],mas[j]);
- swap (cnt[i],cnt[j]);
- i++;
- j--;
- }
- }
- if (j > l) QuickSort(l,j,mas,cnt);
- if (r > i) QuickSort(i,r,mas,cnt);
- }
- int n, k;
- bool ok(int m, double* mas, int* v, int* w){
- for (int i = 0; i < n; i++){
- mas[i] = v[i] - w[i] * m;
- }
- int cnt[n];
- for (int i = 0; i < n; i++){
- cnt[i] = i + 1;
- }
- QuickSort(0, n, mas, cnt);
- double sum = 0;
- int boorder = k;
- int j = n - 1;
- while (boorder > 0){
- sum += mas[j];
- j--;
- boorder--;
- }
- return sum >= 0.0;
- }
- void ok1(int m, double* mas, int* v, int* w, int* cnt){
- for (int i = 0; i < n; i++){
- mas[i] = v[i] - w[i] * m;
- }
- QuickSort(0, n, mas, cnt);
- }
- void QuickSort1(int l,int r, int* mas) {
- if (r - l < 1) return;
- int x = mas[(l + r) / 2];
- int i = l, j = r;
- while (i <= j) {
- while (mas[i] < x) i++;
- while (mas[j] > x) j--;
- if (i <= j) {
- swap (mas[i],mas[j]);
- i++;
- j--;
- }
- }
- if (j > l) QuickSort1(l,j,mas);
- if (r > i) QuickSort1(i,r,mas);
- }
- int main() {
- cin >> n >> k;
- int v[n], w[n];
- for (int i = 0; i < n; i++) {
- cin >> v[i] >> w[i];
- }
- int cnt[n];
- for (int i = 0; i < n; i++){
- cnt[i] = i + 1;
- }
- double mas [n];
- double l = 0;
- double r = 100000000;
- double m;
- for (int i = 0; i < 100; i++)
- {
- m = (l + r) / 2;
- if (ok(m, mas, v, w)) {
- l = m;
- } else r = m;
- }
- //mas[j] = l;
- //QuickSort(0, n - 1, mas, cnt);
- /*for (int i = 0; i < n; i++) {
- cout << cnt[i] << " ";
- }
- cout << endl;*/
- //reverse(cnt, cnt + n);
- ok1(r, mas, v, w, cnt);
- for (int i = 0; i < n; i++)
- cout << cnt[i] << " ";
- int finally[k];
- reverse (cnt, cnt + n);
- for (int i =0; i < k; i++){
- finally[i] = cnt[i];
- }
- QuickSort1(0, k - 1, finally);
- for (int i = 0; i < k; i++) {
- cout << finally[i] << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement