列表

详情


NC205836. 十字爆破

描述

牛牛在玩一个游戏:
一共有n行m列共n*m个方格,每个方格中有一个整数。
牛牛选择一个方格,可以得到和这个方格同行、同列的所有数之和的得分。
例如:对于一个2*2的方格:
1 2
3 4
牛牛选择每个方格的得分如下:
6 7
8 9
因为1+2+3=6,1+2+4=7,1+3+4=8,2+3+4=9。
现在牛牛想知道下一步选择每个格子的得分情况,你可以帮帮他吗?

输入描述

第一行有两个正整数  ,代表方格的行数和列数。 
接下来的 行,每行有 个数 ,代表每个方格中的整数。

输出描述

输出  列整数,分别代表选择每个位置方格的得分情况。

示例1

输入:

2 2
1 2
3 4

输出:

6 7
8 9

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 432ms, 内存消耗: 29280K, 提交时间: 2020-05-21 19:28:14

#include<bits/stdc++.h>
using namespace std;
long long int a[1000009],x[1000009],y[1000009];
int n,m;
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<n*m;i++)
	{
		scanf("%lld",&a[i]);
		x[i/m]=x[i/m]+a[i];
		y[i%m]=y[i%m]+a[i];
	}
	for(int i=0;i<n*m;i++)
	{
		printf("%lld ",x[i/m]+y[i%m]-a[i]);
		if(i%m==m-1)
		cout<<endl;
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 515ms, 内存消耗: 20684K, 提交时间: 2020-07-23 06:53:03

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int N=1e6+10;
ll suml[N],sumh[N],mp[N];
int n,m;
int main(){
	cin>>n>>m;
	for(int i=0;i<n*m;i++) 
		cin>>mp[i],sumh[i/m]+=mp[i],suml[i%m]+=mp[i];
	for(int i=0;i<n*m;i++){
		if(!(i%m)&&i) cout<<endl;
		cout<<sumh[i/m]+suml[i%m]-mp[i]<<' ';		
	}	
}

Python3(3.9) 解法, 执行用时: 1523ms, 内存消耗: 79260K, 提交时间: 2021-04-08 13:00:16

n,m=map(int,input().split())
s_n=[0]*n
s_m=[0]*m
ho=[]
for i in range(n):
    a=list(map(int,input().split()))
    ho.append(a)
    for j in range(m):
        s_n[i]+=a[j]
        s_m[j]+=a[j]

for i in range(n):
    out=[]
    for j in range(m):
        out.append(s_n[i]+s_m[j]-ho[i][j])
    print(*out)

C++(g++ 7.5.0) 解法, 执行用时: 840ms, 内存消耗: 29856K, 提交时间: 2023-03-06 23:08:31

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
long long a[N],h[N],l[N];
int main(){
	int n,m;cin>>n>>m;
	for(int i=0;i<n*m;i++)
	{
		cin>>a[i];
		h[i/m]+=a[i];
		l[i%m]+=a[i];
	}
	for(int i=0;i<n*m;i++)
	{
		cout<<h[i/m]+l[i%m]-a[i]<<' ';
		if(i%m==m-1)cout<<endl;
	}
	return 0;
}

上一题