Advertisement
Guest User

Untitled

a guest
Aug 28th, 2017
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.83 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.FileReader;
  4. import java.io.FileWriter;
  5. import java.io.PrintWriter;
  6. import java.util.StringTokenizer;
  7.  
  8. public class partition {
  9.  
  10. public static void main(String[] args) throws Exception {
  11. //BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
  12. //PrintWriter w = new PrintWriter(System.out);
  13.  
  14. BufferedReader r = new BufferedReader(new FileReader("partition.in"));
  15. PrintWriter w = new PrintWriter(new BufferedWriter(new FileWriter("partition.out")));
  16.  
  17. StringTokenizer st = new StringTokenizer(r.readLine());
  18. int n = Integer.parseInt(st.nextToken());
  19. int fences = Integer.parseInt(st.nextToken());
  20.  
  21. int[][] values = new int[n][n];
  22.  
  23. for (int i = 0; i < n; i++) {
  24. st = new StringTokenizer(r.readLine());
  25. for (int j = 0; j < n; j++) {
  26. values[i][j] = Integer.parseInt(st.nextToken());
  27. }
  28. }
  29.  
  30. int answer = 100000000;
  31. for (int i = 0; i < (1 << (n - 1)); i++) {
  32. if (setBits(i) > fences) continue;
  33.  
  34. boolean[] set = new boolean[n]; //set[i] means that line before i is set.
  35. for (int j = 0; j < n - 1; j++) {
  36. if ((i & 1 << j) > 0) {
  37. set[j + 1] = true;
  38. }
  39. }
  40.  
  41. int start = 0;
  42. int end = 100000000;
  43.  
  44. while (start <= end) {
  45. int mid = (start + end) / 2;
  46.  
  47. boolean possible = true;
  48. int linesLeft = fences - setBits(i);
  49. int[] sections = new int[setBits(i) + 1];
  50. int counter = 0;
  51. for (int j = 0; j < n; j++) {
  52. if (!set[j]) {
  53. sections[counter] += values[j][0];
  54. } else {
  55. sections[++counter] += values[j][0];
  56. }
  57. }
  58.  
  59. for (int j = 1; j < n; j++) {
  60. //Consider adding a vertical line before j.
  61. for (int k = 0; k < sections.length; k++) {
  62. if (sections[k] > mid) {
  63. possible = false;
  64. break;
  65. }
  66. }
  67.  
  68. counter = 0;
  69. for (int k = 0; k < n; k++) {
  70. if (!set[k]) {
  71. sections[counter] += values[k][j];
  72. } else {
  73. sections[++counter] += values[k][j];
  74. }
  75. }
  76.  
  77. boolean setLine = false;
  78. for (int k = 0; k < sections.length; k++) {
  79. if (sections[k] > mid) {
  80. //set the line before j
  81. setLine = true;
  82. break;
  83. }
  84. }
  85.  
  86. counter = 0;
  87. if (setLine && linesLeft > 0) {
  88. linesLeft--;
  89. for (int k = 0; k < sections.length; k++) sections[k] = 0;
  90. for (int k = 0; k < n; k++) {
  91. if (!set[k]) {
  92. sections[counter] += values[k][j];
  93. } else {
  94. sections[++counter] += values[k][j];
  95. }
  96. }
  97. for (int k = 0; k < sections.length; k++) {
  98. if (sections[k] > mid) {
  99. possible = false;
  100. break;
  101. }
  102. }
  103. } else {
  104. for (int k = 0; k < sections.length; k++) {
  105. if (sections[k] > mid) {
  106. possible = false;
  107. break;
  108. }
  109. }
  110. }
  111. }
  112.  
  113. if (!possible) {
  114. start = mid + 1;
  115. } else {
  116. end = mid - 1;
  117. }
  118. }
  119.  
  120. answer = Math.min(answer, start);
  121. }
  122.  
  123. w.println(answer);
  124. w.flush();
  125. }
  126.  
  127. public static int setBits(int n) {
  128. int answer = 0;
  129.  
  130. while (n != 0) {
  131. answer += n & 1;
  132. n >>= 1;
  133. }
  134.  
  135. return answer;
  136. }
  137.  
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement