牛客对于题目链接:十字爆破 (nowcoder.com)
一、分析题目
暴力模拟会超时。
预处理,先把每一行以及每一列的和存起来。模拟即可,但是由于数据量过⼤,我们可以提前把每⼀⾏以及每⼀列的和存起来,⽅便统计总和。
二、代码
//值得学习的代码
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
typedef long long LL;
LL n, m;
LL row[N], col[N];
int main()
{
scanf("%ld %ld", &n, &m);
LL arr[n][m];
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
scanf("%ld", &arr[i][j]);
row[i] += arr[i][j];
col[j] += arr[i][j];
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
printf("%ld ", row[i] + col[j] - arr[i][j]);
}
printf("\n");
}
return 0;
}
三、反思与改进
这道题的思路完全正确,不过没有考虑到数组初始化的问题(尽量还是定义全局变量,不需要再对数组进行初始化)。另外注意一下,这道题的输入输出数据量较大,所以尽量选择使用 scanf 或更快的 IO 方式。