牛客算法周周练8 E Board

链接: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值