1. 程式人生 > >牛客國慶集訓派對Day6 B-Board (思維)

牛客國慶集訓派對Day6 B-Board (思維)

題目描述

恬恬有一個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

解題思路:列舉每一行,如果該行所有數都大於0,那麼就消掉這一行的最小值。然後列舉列做同樣的操作。把-1初始化為一個很大的數即可。最後重新推算出答案就好了。

#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0)
#define ll long long
using namespace std;
const int MAXN=1002;

int a[MAXN][MAXN];

int main(){

    int N;
    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)
                a[i][j]=50000;
        }
    }

    for(int i=1;i<=N;i++){
        int minn=500000;
        for(int j=1;j<=N;j++){
            if(a[i][j]<minn)
                minn=a[i][j];
        }
        if(minn!=0){
            for(int j=1;j<=N;j++)
                a[i][j]-=minn;
        }
    }

    for(int i=1;i<=N;i++){
        int minn=500000;
        for(int j=1;j<=N;j++){
            if(a[j][i]<minn)
                minn=a[j][i];
        }
        if(minn!=0){
            for(int j=1;j<=N;j++)
                a[j][i]-=minn;
        }
    }

    for(int i=1;i<=N;i++)
        for(int j=1;j<=N;j++)
            if(a[i][j]!=0)
                cout<<50000-a[i][j]<<endl;


    return 0;
}