44.开发商购买土地
(用到了前缀和的知识)
题目链接
//卡码网题号44.开发商购买土地
#include<iostream>
#include<vector>
#include<climits>
using namespace std;
int main() {
int n, m;
int sum=0;
cin >> n >> m;
vector<vector<int>> res(n, vector<int>(m));
//初始化二维数组
for (int i = 0;i < n;i++) {
for (int j = 0;j < m;j++) {
cin >> res[i][j];
sum += res[i][j];//求矩阵所有元素的和
}
}
//求每行的和存在数组rowSum里面
vector<int> rowSum(n);
for (int i = 0;i < n;i++) {
for (int j = 0;j < m;j++) {
rowSum[i] += res[i][j];
}
}
//求每列的和存在数组colSum里面
vector<int> colSum(m);
for (int j = 0;j < m;j++) {
for (int i = 0;i < n;i++) {
colSum[j] += res[i][j];
}
}
int sumFront = 0;
int result = INT_MAX;
//先对行求最小差
for (int i = 0;i < n;i++) {
sumFront += rowSum[i];//每一次循环都要累加一个后面的和
if (abs(sumFront-(sum-sumFront))<result) {//将矩阵根据分割线划分成sumFront和sum-sumFront两个部分,然后计算差
result = abs(sumFront - (sum - sumFront));//将差小的划分方法的差存入result中
}
}
//将前部分和重新置零
sumFront = 0;
//对列求最小差
for (int i = 0;i < m;i++) {
sumFront += colSum[i];
if (abs(sumFront - (sum - sumFront)) < result) {
result = abs(sumFront - (sum - sumFront));
}
}
cout << result << endl;
//for (int i = 0;i < n;i++) {
// for (int j = 0;j < m;j++) {
// cout << res[i][j];
// }
//}
return 0;
}