题目:
在一个城市区域内,被划分成了n * m个连续的区块,每个区块都拥有不同的权值,代表着其土地价值。目前,有两家开发公司,A 公司和 B 公司,希望购买这个城市区域的土地。
现在,需要将这个城市区域的所有区块分配给 A 公司和 B 公司。
然而,由于城市规划的限制,只允许将区域按横向或纵向划分成两个子区域,而且每个子区域都必须包含一个或多个区块。 为了确保公平竞争,你需要找到一种分配方式,使得 A 公司和 B 公司各自的子区域内的土地总价值之差最小。
注意:区块不可再分。
输入描述
第一行输入两个正整数,代表 n 和 m。
接下来的 n 行,每行输出 m 个正整数。
输出描述
请输出一个整数,代表两个子区域内土地总价值之间的最小差距。
思路:
建立两个新数组row[ ]和col[ ]分别用于记录原数组每行/列和,便于划分时比较两边大小
代码:
#include<stdio.h>
#include<stdlib.h>
int devide(int* s , int len , int sum){
int left = 0,right = 0,min = sum;
for (int i = 0; i < len - 1 ; i++) {
left += s[i];
right = sum - left;
min = min < abs(left - right) ? min : abs(left - right);
}
return min;
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
int arr[n][m]; //创建二维数组
int row[n]; // 记录每行和
int sum = 0;
for (int i = 0 ; i < n ; i ++) {
row[i] = 0;
for(int j = 0 ; j < m ; j ++){
scanf("%d",&arr[i][j]); //将数据输入二维数组
row[i] += arr[i][j]; //row[]的一格表示arr[][]的一行和
}
sum += row[i]; //数组中所有数据总和
}
int col[m]; // 记录每列和
for (int j = 0; j < m; j++) {
col[j] = 0;
for (int i = 0; i < n; i++) {
col[j] += arr[i][j];
}
}
int row_min = devide(row,n,sum);
int col_min = devide(col,m,sum);
printf("%d\n",(row_min < col_min) ? row_min : col_min);
return 0;
}
总结:
这块还不太懂,待下次研究研究ε(┬┬﹏┬┬)3
int devide(int* s , int len , int sum){
int left = 0,right = 0,min = sum;
for (int i = 0; i < len - 1 ; i++) {
left += s[i];
right = sum - left;
min = min < abs(left - right) ? min : abs(left - right);
}
return min;
}