fork(1) download
  1. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Set; import java.util.TreeMap;
  2.  
  3. public class Main {
  4.  
  5. public static void main(String[] args) {
  6. try {
  7. int t = Integer.parseInt(br.readLine());
  8. int n = 0, k = 0;
  9. String key = null;
  10. Integer value = 0, reqCnt = 0, demand = 0;
  11. TreeMap<Integer, Integer> table = new TreeMap<Integer, Integer>();
  12. HashMap<Integer, Integer> reqCntTable = new HashMap<Integer, Integer>();
  13. String data[] = null;
  14.  
  15. for (int i = 0; i < t; i++) {
  16. reqCntTable.clear();
  17. table.clear();
  18. data = br.readLine().split(" ");
  19. n = Integer.parseInt(data[0]);
  20. k = Integer.parseInt(data[1]);
  21.  
  22. data = br.readLine().split(" ");
  23. if (k == 1) {
  24. System.out.println(0);
  25. continue;
  26. }
  27. for (int j = 0; j < n; j++) {
  28. key = data[j].trim();
  29. value = table.get(Integer.parseInt(key));
  30. if (value == null) {
  31. value = 0;
  32.  
  33. }
  34. value++;
  35. value = value % k;
  36. table.put(Integer.parseInt(key), value);
  37.  
  38.  
  39. }
  40. Collection<Integer> boquey = table.values();
  41. ArrayList<Integer> heights = new ArrayList<Integer>(boquey);
  42. int hlen=heights.size();
  43.  
  44. Set keys=table.keySet();
  45. Iterator iterator=keys.iterator();
  46. Integer keyStr=0;
  47.  
  48. while(iterator.hasNext()){
  49. keyStr=(Integer) iterator.next();
  50. demand = (k -table.get(keyStr));
  51. reqCnt = reqCntTable.get(demand);
  52. if (reqCnt == null) {
  53. reqCnt = 1;
  54. }else{
  55. reqCnt++;
  56. }
  57. reqCntTable.put(demand, reqCnt);
  58. }
  59.  
  60.  
  61. long result = 0L;
  62. int len = heights.size();
  63. int freePool = 0, cpool = 0;
  64. Integer available = 0;
  65. int j = 0;
  66. int bqCnt=0;
  67. int reqAux = 0,req=0;
  68.  
  69. for (j = len - 1; j > 0; j--) {
  70. cpool = heights.get(j);
  71. reqAux = k - cpool;
  72. available = reqCntTable.get(cpool);
  73. if((available != null)&&(available==1)){
  74. available--;
  75. reqCntTable.put(cpool, available);
  76. req=k-cpool;
  77. if(req<=freePool){
  78. freePool-=req;
  79. result += req;
  80. continue;
  81. }
  82. }
  83. if ((available != null) && (available >0)) {
  84. int index=heights.indexOf(reqAux);
  85. heights.set(index, 0);
  86. result+=cpool;
  87. available--;
  88. reqCntTable.put(cpool, available);
  89. reqAux = k - cpool;
  90. available = reqCntTable.get(reqAux);
  91. available--;
  92. reqCntTable.put(reqAux, available);
  93. }else{
  94. freePool += cpool;
  95. bqCnt=freePool/k;
  96. freePool=freePool%k;
  97. result+=(k-1)*bqCnt;
  98. }
  99. }
  100.  
  101. bqCnt=freePool/k;
  102. freePool=freePool%k;
  103. result+=(k-1)*bqCnt;
  104.  
  105. result += freePool;
  106. table.clear();
  107. System.out.println(result);
  108. }
  109. } catch (IOException ex) {
  110. }
  111.  
  112. }
  113.  
  114. }
  115.  
Success #stdin #stdout 0.05s 711168KB
stdin
1
12 4
1 2 3 4 4 5 6 7 8 9 10 11
stdout
8