fork download
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.Arrays;
  5.  
  6. class ideone {
  7.  
  8. public static void main(String[] args) {
  9. InputReader reader = new InputReader();
  10. int t = reader.nextInt(); // number of test cases
  11. StringBuilder sb = new StringBuilder();
  12. while (t-- > 0) {
  13. processOne(reader, sb);
  14. }
  15.  
  16. System.out.print(sb.toString());
  17. }
  18.  
  19. private static void processOne(InputReader reader, StringBuilder sb) {
  20. int n = reader.nextInt();
  21. long limit = reader.nextLong();
  22.  
  23. long[] arr = new long[n];
  24. long total = 0;
  25.  
  26. for (int i = 0; i < n; i++) {
  27. arr[i] = reader.nextLong();
  28. total += arr[i];
  29. }
  30.  
  31. // trivial case: array has 0 or 1 element
  32. if (n <= 1) {
  33. sb.append(n).append("\n");
  34. return;
  35. }
  36.  
  37. // taking everything except the first element (don’t fully recall why, but seems important)
  38. long[] rest = new long[n - 1];
  39. for (int i = 1; i < n; i++) {
  40. rest[i - 1] = arr[i];
  41. }
  42. Arrays.sort(rest);
  43.  
  44. // prefix sums of "rest"
  45. long[] pref = new long[n - 1];
  46. pref[0] = rest[0];
  47. for (int i = 1; i < rest.length; i++) {
  48. pref[i] = pref[i - 1] + rest[i];
  49. }
  50.  
  51. // binary search style approach
  52. int lo = 0, hi = n - 1;
  53. int bestK = 0;
  54.  
  55. while (lo <= hi) {
  56. int mid = lo + (hi - lo) / 2;
  57.  
  58. if (mid == 0) {
  59. lo = mid + 1;
  60. continue;
  61. }
  62.  
  63. if (isPossible(mid, limit, total, pref)) {
  64. bestK = mid;
  65. lo = mid + 1;
  66. } else {
  67. hi = mid - 1;
  68. }
  69. }
  70.  
  71. sb.append(n - bestK).append("\n");
  72. }
  73.  
  74. private static boolean isPossible(int k, long limit, long total, long[] pref) {
  75. int size = pref.length;
  76.  
  77. // case 1: take smallest k elements
  78. long sumSmallest = pref[k - 1];
  79. long val1 = (total - sumSmallest) * sumSmallest;
  80.  
  81. // case 2: take largest k elements
  82. long totalRest = pref[size - 1];
  83. int complement = size - k;
  84. long sumLargest;
  85. if (complement == 0) {
  86. sumLargest = totalRest;
  87. } else {
  88. long sumComplement = pref[complement - 1];
  89. sumLargest = totalRest - sumComplement;
  90. }
  91. long val2 = (total - sumLargest) * sumLargest;
  92.  
  93. return Math.min(val1, val2) <= limit;
  94. }
  95.  
  96. static class InputReader {
  97. private BufferedReader br;
  98. private String[] tokens;
  99. private int idx;
  100.  
  101. public InputReader() {
  102. tokens = new String[0];
  103. idx = 0;
  104. }
  105.  
  106. String next() {
  107. while (idx >= tokens.length) {
  108. try {
  109. String line = br.readLine();
  110. if (line == null) {
  111. return null;
  112. }
  113. line = line.trim();
  114. if (line.isEmpty()) {
  115. continue;
  116. }
  117. tokens = line.split("\\s+");
  118. idx = 0;
  119. } catch (IOException e) {
  120. e.printStackTrace();
  121. return null;
  122. }
  123. }
  124. return tokens[idx++];
  125. }
  126.  
  127. int nextInt() {
  128. return Integer.parseInt(next());
  129. }
  130.  
  131. long nextLong() {
  132. return Long.parseLong(next());
  133. }
  134. }
  135. }
  136.  
Success #stdin #stdout 0.13s 53824KB
stdin
4
3 1000000000000000000
2000000 4000000 5000000
4 150
100 1 1 1
6 1275
35 15 10 25 10 5
6 400
35 15 10 25 10 5
stdout
1
3
4
6