java小美有一个短形的蛋糕共分成了n行m列共nm 个区 域每个区域是一个小正方形已知蛋糕每个区域都有一个美味度。她想切一刀把疆糕切成两部分自己吃一部分小团吃另部分。 小美希望两个人吃的部分的美味度之和尽可能接近请你输出s1-s2的最小值。 其中s1代表小美吃的美味度s2代表小团吃的美味度 请务必保证切下来的区域都是完整的即不能把某个小正方形切成两个小区域 输入描述 第一行输出两个正整数n和m代表
解题思路:
- 先计算蛋糕的总美味度sum,然后初始化最小值diff为sum。
- 遍历所有可能的切割位置,即从第1行到第n-1行,从第1列到第m-1列。
- 在每个切割位置,计算两部分的美味度之差,即s1 - s2 = sum - 2 * (sum1 + sum2),其中sum1表示切割后左上部分的美味度之和,sum2表示切割后右下部分的美味度之和。
- 更新最小值diff为所有切割位置中的最小值。
- 输出最小值diff。
Java代码实现如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int[][] a = new int[n][m];
int sum = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
a[i][j] = scanner.nextInt();
sum += a[i][j];
}
}
int diff = sum;
for (int i = 1; i < n; i++) {
int sum1 = 0;
for (int j = 0; j < i; j++) {
for (int k = 0; k < m; k++) {
sum1 += a[j][k];
}
}
int sum2 = sum - sum1;
int tempDiff = Math.abs(sum1 - sum2);
if (tempDiff < diff) {
diff = tempDiff;
}
}
for (int i = 1; i < m; i++) {
int sum1 = 0;
for (int j = 0; j < n; j++) {
for (int k = 0; k < i; k++) {
sum1 += a[j][k];
}
}
int sum2 = sum - sum1;
int tempDiff = Math.abs(sum1 - sum2);
if (tempDiff < diff) {
diff = tempDiff;
}
}
System.out.println(diff);
}
}
复杂度分析: 该算法的时间复杂度为O(n*m),其中n和m分别表示蛋糕区域的行数和列数
原文地址: https://www.cveoy.top/t/topic/iBoS 著作权归作者所有。请勿转载和采集!