2020 CCPC-Wannafly Winter Camp Day3 Div.1&2(A 黑色气球)(解方程)
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
小D面前有
n
{n}
n 个黑色的气球。
假设第
i
{i}
i 个黑色气球的高度是一个正整数
h
i
h_i
hi ,现在小D知道了任意两个不同气球的高度之和,你能帮小D还原出每个黑色气球的具体高度嘛?
输入描述:
第一行一个整数
n
{n}
n
接下来
n
{n}
n 行,每行
n
{n}
n 个整数,其中第
i
{i}
i 行第
j
{j}
j 个整数表示第
i
{i}
i 个气球和第
j
{j}
j 个气球的高度之和。(当
i
=
j
{i=j}
i=j 时这个数为
0
{0}
0)。
2
≤
n
≤
1000
2\le n\le 1000
2≤n≤1000,输入的每个数不超过
1
0
5
10^5
105 。数据保证答案唯一。
输出描述:
一行
n
{n}
n 个整数,表示答案。
保证答案唯一。
示例1
输入
5
0 3 4 5 6
3 0 5 6 7
4 5 0 7 8
5 6 7 0 9
6 7 8 9 0
输出
1 2 3 4 5
题解
解方程即可,不过有一个巧妙的解法:
先利用前三条方程解出第一项的值,再利用与第一条有关的方程解出相关项即可。
代码
#include<stdio.h>
int main() {
int n, i, j, x, h1;
scanf("%d", &n);
int a[1001][1001];
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
x = a[2][3] - a[1][2];
h1 = (a[1][3] - x) / 2;
printf("%d ", h1);
for (i = 2; i <= n; i++)
printf("%d ", a[1][i] - h1);
return 0;
}