题解:P13420 [COCI 2012/2013 #6] SUME

· · 题解

前言

a 为输入的矩阵,a_{i,j} 表示数组中第 i 行,第 j 列的值,A 表示题目中最终需要输出的数,A_i 表示这些数中的第 i 个。

注意:在这篇题解中下标从 0 开始到 n-1

思路

可以发现在整个数组中有两个行、列可以作为突破口。

它们是第 0 行(即对于所有的 a_{0,i},其中 i\in[0,n-1])和第 n-1 列(即对于左右的 a_{i,n-1},其中 i\in[0,n-1])。

根据题意,可以得到如下信息(其中 i\in[0,n-1])。

a_{0,i}=A_0+A_i\\ a_{i,n-1}=A_i+A_{n-1}

如果我们把 a_{0,i}a_{i,n-1} 相减就可以得到一个惊人的事实(其中 i\in[0,n-1])。

a_{i,n-1}-a_{0,i}=(A_i+A_{n-1})-(A_0+A_i)=A_{n-1}-A_0 求出 $A_0$ 之后,只需要将所有的 $a_{0,i}$ 减去 $A_0$ 即可求出所有的 $A_{i+1}$(其中 $i\in[1,n-1]$)。 ## 代码 代码如下。 ```cpp #include<bits/stdc++.h> using namespace std; int main() { long long n; cin>>n; long long a[n][n],a1[n],a2[n]; if(n==2) { cout<<"1 1"; return 0; } for(long long i=0;i<n;i++) { for(long long j=0;j<n;j++) { cin>>a[i][j]; } } for(long long i=0;i<n;i++) { a1[i]=a[0][i]; } a1[0]=(a[0][n-1]-(a[1][n-1]-a[0][1]))/2; for(long long i=1;i<n;i++) { a1[i]=a1[i]-a1[0]; } for(long long i=0;i<n;i++) { cout<<a1[i]<<" "; } return 0; } ```