链接:https://ac.nowcoder.com/acm/contest/5803/E
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 1048576K,其他语言2097152K
64bit IO Format: %lld
题目描述
恬恬有一个nx n的数组。她在用这个数组玩游戏:
开始时,数组中每一个元素都是0。
恬恬会做某些操作。在一次操作中,她可以将某一行的所有元素同时加上一个值,也可以将某一列的所有元素同时加上一个值。
在几次操作后,一个元素被隐藏了。你能帮助她回忆隐藏的数是几吗?
输入描述:
第一行一个整数n(1≤ n≤ 1000)。 接下来n行每行n个整数表示数组a。 第(i+1)行的第j个元素表示aij(aij=-1或0≤ aij ≤ 10000)。-1表示隐藏的元素。
输出描述:
仅一个整数表示答案。
示例1
输入
3 1 2 1 0 -1 0 0 1 0
输出
1
思路:
见过这个题,原题不是加任意数而是加1,不过其实是一样的。。。
我们首先分析,设x[i]x[i]表示第i行加的数字之和,y[i]y[i]表示第i列加的数字之和,第i行第j列的数字为s(i,j)s(i,j)。
那么,对于第i行第j列的数字,它现在的值即为x[i]+y[j]x[i]+y[j]。
于是,我们设被隐藏的数字是第a行第b列的那个,那么它的值即为x[a]+y[b]x[a]+y[b]
我们想办法把这个和构造出来。
我们随便再找两个数字c,d(c,d<=n),使得c!=a,d!=b
那么,我们就有:
s(c,b)=x[c]+y[b]s(c,b)=x[c]+y[b]
s(a,d)=x[a]+y[d]s(a,d)=x[a]+y[d]
s(c,d)=x[c]+y[d]s(c,d)=x[c]+y[d]
注意到,s(c,b)+s(a,d)-s(c,d)=s(a,b)=x[a]+y[b]s(c,b)+s(a,d)−s(c,d)=s(a,b)=x[a]+y[b]
而,又因为只有第a行第b列的值是不确定的,所以,这三个数字的值是确定的。
所以,我们直接输出这个式子的值就行了
#include<bits/stdc++.h>
using namespace std;
int a[1001][1001];
signed main(){
int n,x,y;
scanf("%d",&n);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
scanf("%d",&a[i][j]);
if(a[i][j]==-1){
x=i,y=j;
}
}
}
int k=1,t=1;
if(y==k)++k;
if(x==t)++t;
printf("%d",a[x][k]+a[t][y]-a[t][k]);
return 0;
}