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