题解:P13420 [COCI 2012/2013 #6] SUME
Chenxuhang_play
·
·
题解
前言
记 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;
}
```