Advertisement
Guest User

Untitled

a guest
Nov 16th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. vector<long double> v;
  8. vector<long double> w;
  9. vector<long double> a;
  10. vector<pair<long double, int> > a1;
  11. int n, k;
  12. long double ans1, ans2;
  13. const long double eps = 0.0000001;
  14.  
  15. vector<long double> b;
  16. vector<pair<long double, int>> b1;
  17.  
  18. void sorting(int lef, int rig) {
  19. if (rig == lef + 1) {
  20. return;
  21. }
  22. sorting(lef, (rig + lef) / 2);
  23. sorting((rig + lef) / 2, rig);
  24. int le2 = lef;
  25. b.resize(rig - lef);
  26. int m = 0;
  27. int le3 = (rig + lef) / 2;
  28. while (le2 < (rig + lef) / 2 || le3 < rig) {
  29. if (le2 == (rig + lef) / 2) {
  30. b[m] = a[le3];
  31. le3++;
  32. m++;
  33. continue;
  34. }
  35. if (le3 == rig) {
  36. b[m] = a[le2];
  37. le2++;
  38. m++;
  39. continue;
  40. }
  41. if (a[le2] < a[le3]) {
  42. b[m] = a[le2];
  43. le2++;
  44. m++;
  45. } else {
  46. b[m] = a[le3];
  47. le3++;
  48. m++;
  49. }
  50. }
  51. for (int i = 0; i < rig - lef; i++) {
  52. a[lef + i] = b[i];
  53. }
  54. }
  55.  
  56. void sorting1(int lef, int rig) {
  57. if (rig == lef + 1) {
  58. return;
  59. }
  60. sorting1(lef, (rig + lef) / 2);
  61. sorting1((rig + lef) / 2, rig);
  62. int le2 = lef;
  63. b1.resize(rig - lef);
  64. int m = 0;
  65. int le3 = (rig + lef) / 2;
  66. while (le2 < (rig + lef) / 2 || le3 < rig) {
  67. if (le2 == (rig + lef) / 2) {
  68. b1[m] = a1[le3];
  69. le3++;
  70. m++;
  71. continue;
  72. }
  73. if (le3 == rig) {
  74. b1[m] = a1[le2];
  75. le2++;
  76. m++;
  77. continue;
  78. }
  79. if (a1[le2] < a1[le3]) {
  80. b1[m] = a1[le2];
  81. le2++;
  82. m++;
  83. } else {
  84. b1[m] = a1[le3];
  85. le3++;
  86. m++;
  87. }
  88. }
  89. for (int i = 0; i < rig - lef; i++) {
  90. a1[lef + i] = b1[i];
  91. }
  92. }
  93.  
  94.  
  95.  
  96. int main() {
  97. freopen("kbest.in", "r", stdin);
  98. freopen("kbest.out", "w", stdout);
  99. ios_base::sync_with_stdio(0);
  100. cin.tie(0);
  101. cin >> n >> k;
  102. v.resize(n);
  103. w.resize(n);
  104. a.resize(n);
  105. a1.resize(n);
  106. ans1 = 0;
  107. ans2 = 0;
  108. for (int i = 0; i < n; i++) {
  109. cin >> v[i] >> w[i];
  110. if (i < k) {
  111. ans1 += v[i];
  112. ans2 += w[i];
  113. }
  114. }
  115. long double l = -0.001;
  116. long double r = ans1 / ans2 + 1;
  117. while (r - l > eps) {
  118. long double mid = (l + r) / 2;
  119. for (int i = 0; i < n; i++) {
  120. a[i] = v[i] - mid * w[i];
  121. }
  122. sorting(0, n);
  123. long double answ = 0;
  124. for (int i = n - 1; i >= n - k; i--) {
  125. answ += a[i];
  126. }
  127. if (answ >= -eps) {
  128. l = mid;
  129. } else {
  130. r = mid;
  131. }
  132. }
  133. for (int i = 0; i < n; i++) {
  134. a1[i].first = v[i] - r * w[i];
  135. a1[i].second = i;
  136. }
  137. sorting1(0, n);
  138. for (int i = n - 1; i >= n - k; i--) {
  139. cout << a1[i].second + 1 << " ";
  140. }
  141. return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement