牛客对于题目链接:十字爆破 (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 方式。