一个二维数组 a 的大小为 n×n。定义 b i为数组 a 中第 i 行元素的总和,而 c j为第 j 列元素的总和。接着,定义 d i? 为第 i 行和列和的差的绝对值,即 ∣b i ?c i ∣。给定这个二维数组 a,逐行输出所有 d i? 的值,其中 1≤i≤n,每个 d i 的值输出在一行上。
第一行,包含一个整数 n。
接下来 n 行,每行包含 n 个整数。
共 n 行,每行一个整数,其中第 i 行表示 d i? 。
样例输入 1
3
1 2 3
4 6 1
2 3 3
样例输出 1
1
0
1
数据范围与提示
1<n≤1000,1≤b i,a i? ≤10000
这个题要多次for循环,输入时候遍历一次,计算行之和要遍历一次,计算列之和还要遍历一次,最后计算d数组也要遍历一次。时间复杂度很高。
所以我们就在输入数组的时候,就把行之和先计算出来,然后再遍历一次计算列之和,这样就少了一次循环。
然后就是内存,一个二维数组是肯定要开的,行之和也需要一个数组,列的话和d数组其实不用开,可以在遍历列的时候就把列和d都计算出来直接输出,其实我试了一下开三个数组也是没问题的,内存足够能过。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4;
int a[N][N],rowNum[N],colNum[N];
int main(){
int n;
cin >> n;
for(int i=0;i<n;i++){
int row = 0;//统计行
for(int j = 0;j < n;j ++){
cin >> a[i][j];
row+=a[i][j];
}
rowNum[i] = row;
}
for(int i=0;i<n;i++){
int col = 0;//统计列
for(int j = 0;j < n;j ++){
col+=a[j][i];
}
colNum[i] = col;
}
for(int i=0;i<n;i++){
cout << abs(rowNum[i]-colNum[i])<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4;
int a[N][N],rowNum[N],colNum[N];
int main(){
int n;
cin >> n;
for(int i=0;i<n;i++){
int row = 0;//统计行
for(int j = 0;j < n;j ++){
cin >> a[i][j];
row+=a[i][j];
}
rowNum[i] = row;
}
for(int i=0;i<n;i++){
int col = 0;//统计列
for(int j = 0;j < n;j ++){
col+=a[j][i];
}
cout << abs(col-rowNum[i]) <<endl; //这一步直接计算d输出了
}
return 0;
}