题目
:在一个城市区域内,被划分成了n * m个连续的区块,每个区块都拥有不同的权值,代表着其土地价值。目前,有两家开发公司,A 公司和 B 公司,希望购买这个城市区域的土地。 现在,需要将这个城市区域的所有区块分配给 A 公司和 B 公司。然而,由于城市规划的限制,只允许将区域按横向或纵向划分成两个子区域,而且每个子区域都必须包含一个或多个区块。 为了确保公平竞争,你需要找到一种分配方式,使得 A 公司和 B 公司各自的子区域内的土地总价值之差最小。
注意:区块不可再分。
输入描述
第一行输入两个正整数,代表 n 和 m。
接下来的 n 行,每行输出 m 个正整数。
输出描述
请输出一个整数,代表两个子区域内土地总价值之间的最小差距。
输入示例
3 3
1 2 3
2 1 3
1 2 3
输出示例
0
题解
:本题考查前缀和,根据题意,先获取二维数组输入,然后按行、按列求和,对行和、列和数组进行前缀求和,初始设置结果res为INT32_MAX,判断最小res,并输出。
代码(C++)
:
#include <bits/stdc++.h>
using namespace std;
int sumofN(vector<int> arr,int n){ //前缀和
int sum = 0;
for(int i = 0; i < n; i++){
sum += arr[i];
}
return sum;
}
int main(){
int n,m,temp;
cin >> n >> m;
vector<vector<int>> land(n,vector<int>(m,0));
vector<int> row(n,0);
vector<int> col(m,0);
int res = INT32_MAX;
for(int i = 0; i < n; i++){ //获取二维数组land
for(int j = 0; j < m; j++){
cin >> land[i][j];
}
}
for(int i = 0; i < n; i++){ //求行和
for(int j = 0; j < m; j++){
row[i] += land[i][j];
}
}
for(int i = 0; i < m; i++){ //求列和
for(int j = 0; j < n; j++){
col[i] += land[j][i];
}
}
for(int i = 0; i < n; i++){ //判断行和最小差值,赋予res
temp = abs(2 * sumofN(row,i)-sumofN(row,n));
if(temp < res) res = temp;
}
for(int i = 0; i < m; i++){ //继续判断列和最小差值,更新res
temp = abs(2 * sumofN(col,i)-sumofN(col,m));
if(temp < res) res = temp;
}
cout << res << endl;
return 0;
}
写在后面
这个专栏主要是我在刷题的过程中总结的一些笔记,因为我学的也很一般,如果有错误和不足之处,还望大家在评论区指出。希望能给大家的学习带来一点帮助,共同进步!!!