小美希望两个人吃的部分的美味度之和尽可能接近,请你输出的最小值。(其中代表小美吃的美味度,代表小团吃的美味度)。
请务必保证,切下来的区域都是完整的,即不能把某个小正方形切成两个小区域。
第一行输出两个正整数 和 ,代表蛋糕区域的行数和列数。
接下来的 行,每行输入 个正整数 ,用来表示每个区域的美味度。
一个整数,代表 的最小值。
2 3 1 1 4 5 1 4
0
把蛋糕像这样切开:
1 1 | 4
5 1 | 4
左边蛋糕美味度之和是8
右边蛋糕美味度之和是8
所以答案是0。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int n=in.nextInt(); long[]row=new long[n]; int m=in.nextInt(); long[]col=new long[m]; int[][]matrix=new int[n][m]; for (int i = 0; i < n; i++) { if (i>0) row[i]=row[i-1]; for (int j = 0; j < m; j++) { matrix[i][j]=in.nextInt(); row[i]+=matrix[i][j]; } } long sum=row[n-1]; for (int i = 0; i < m; i++) { if (i>0) col[i]=col[i-1]; for (int j = 0; j < n; j++) { col[i]+=matrix[j][i]; } } long ans=Long.MAX_VALUE; for (long a:row){ ans=Math.min(ans,Math.abs(sum-a*2)); } for (long a:col){ ans=Math.min(ans,Math.abs(sum-a*2)); } System.out.println(ans); } }
public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String[] strings = reader.readLine().split(" "); int n = Integer.parseInt(strings[0]); int m = Integer.parseInt(strings[1]); int[][] cake = new int[n][m]; for (int i = 0; i < n; i++) { String[] s = reader.readLine().split(" "); for (int j = 0; j < m; j++) { cake[i][j] = Integer.parseInt(s[j]); } } long minDiff = Long.MAX_VALUE; long totalSum = 0; for (int[] ints : cake) { for (long anInt : ints) { totalSum += anInt; } } long sum = 0; if (cake[0].length == 1) { System.out.println(totalSum); } else { //先想象把蛋糕横着分开 for (int i = 1; i < n; i++) { for (int j = 0; j < n - i; j++) { for (int k = 0; k < m; k++) { sum += cake[j][k]; } } minDiff = Math.min(minDiff, Math.abs(sum - (totalSum - sum))); sum = 0; } //竖着分开的请况 for (int i = 1; i < m; i++) { for (int[] ints : cake) { for (int k = 0; k < m - i; k++) { sum += ints[k]; } } minDiff = Math.min(minDiff, Math.abs(sum - (totalSum - sum))); sum = 0; } System.out.println(minDiff); } }