fork download
  1. /* paiza POH! Lite
  2.  * result:
  3.  * http://p...content-available-to-author-only...a.jp/poh/kirishima/result/000512911c98eece9b0aa060fa6ce332
  4.  * author: Leonardone @ NEETSDKASU
  5.  */
  6. import java.io.*;
  7. import java.lang.*;
  8. import java.util.*;
  9.  
  10. class Main
  11. {
  12. static class Data implements Comparable<Data> {
  13. public int q;
  14. public int r;
  15. public double p;
  16. public int compareTo(Data o) {
  17. return (int)(o.p - this.p);
  18. }
  19. }
  20.  
  21. static int parseInt(String str) {
  22. int len = str.length();
  23. int n = 0;
  24. for (int i = 0; i < len; i++) {
  25. n = n * 10 + (int)(str.charAt(i) - '0');
  26. }
  27. return n;
  28. }
  29.  
  30. static Data[] data = new Data[100];
  31. static int all_q = 0;
  32. static int all_r = 0;
  33.  
  34. public static void main (String[] args) throws java.lang.Exception
  35. {
  36. int m, n, i;
  37.  
  38. m = parseInt(in.readLine());
  39. n = parseInt(in.readLine());
  40.  
  41. for (i = 0; i < n; i++) {
  42. String[] str = in.readLine().split(" ");
  43. data[i] = new Data();
  44. all_q += data[i].q = parseInt(str[0]);
  45. all_r += data[i].r = parseInt(str[1]);
  46. data[i].p = (double)data[i].r / (double)data[i].q;
  47. }
  48. for (; i < 100; i++) {
  49. data[i] = new Data();
  50. }
  51.  
  52. Arrays.sort(data, 0, n);
  53.  
  54. int sum_q = 0, sum_r = 0;
  55. for (i = 0; sum_q < m && i < n; i++) {
  56. sum_q += data[i].q;
  57. sum_r += data[i].r;
  58. }
  59.  
  60. if (n - i > i) {
  61. i += 3;
  62. foo(m, i > n ? n : i);
  63. } else {
  64. i -= 5;
  65. if (i < 0) {
  66. i = 0;
  67. }
  68. bar(m, n - i, i);
  69. }
  70.  
  71. }
  72.  
  73. static void foo(int m, int n) {
  74. int a0, a1, b0, b1, c0;
  75. int min, sum_q, sum_r;
  76. int i;
  77.  
  78. if (n > 25) {
  79. b0 = 0;
  80. b1 = 1 << (n - 25);
  81. } else {
  82. b0 = 1 << n;
  83. b1 = 0;
  84. }
  85.  
  86. a0 = 1;
  87. a1 = 0;
  88. c0 = 1 << 25;
  89. min = 250000000;
  90. for (;;) {
  91. if (a1 > b1) {
  92. break;
  93. } else if (a1 == b1 && a0 > b0) {
  94. break;
  95. }
  96. if (a0 == c0) {
  97. a0 = 0;
  98. a1++;
  99. }
  100. sum_q = sum_r = 0;
  101. for (i = 0; i < 25; i++) {
  102. if (1 == ((a0 >> i) & 1)) {
  103. sum_q += data[i].q;
  104. sum_r += data[i].r;
  105. }
  106. if (1 == ((a1 >> i) & 1)) {
  107. sum_q += data[i + 25].q;
  108. sum_r += data[i + 25].r;
  109. }
  110. }
  111. if (sum_q >= m && sum_r < min) {
  112. min = sum_r;
  113. }
  114. a0++;
  115. }
  116. System.out.println(min);
  117. }
  118.  
  119. static void bar(int m, int n, int d) {
  120. int a0, a1, b0, b1, c0;
  121. int min, sum_q, sum_r;
  122. int i;
  123.  
  124. if (n > 25) {
  125. b0 = 0;
  126. b1 = 1 << (n - 25);
  127. } else {
  128. b0 = 1 << n;
  129. b1 = 0;
  130. }
  131.  
  132. a0 = 1;
  133. a1 = 0;
  134. c0 = 1 << 25;
  135. min = 250000000;
  136. for (;;) {
  137. if (a1 > b1) {
  138. break;
  139. } else if (a1 == b1 && a0 > b0) {
  140. break;
  141. }
  142. if (a0 == c0) {
  143. a0 = 0;
  144. a1++;
  145. }
  146. sum_q = sum_r = 0;
  147. for (i = 0; i < 25; i++) {
  148. if (1 == ((a0 >> i) & 1)) {
  149. sum_q += data[i + d].q;
  150. sum_r += data[i + d].r;
  151. }
  152. if (1 == ((a1 >> i) & 1)) {
  153. sum_q += data[i + d + 25].q;
  154. sum_r += data[i + d + 25].r;
  155. }
  156. }
  157. if (all_q - sum_q >= m && all_r - sum_r < min) {
  158. min = all_r - sum_r;
  159. }
  160. a0++;
  161. }
  162. System.out.println(min);
  163. }
  164.  
  165. }
Success #stdin #stdout 0.07s 380224KB
stdin
250
5
35 3640
33 2706
98 9810
57 5472
95 7790 
stdout
23072