链接:https://www.nowcoder.com/acm/contest/206/B
来源:牛客网

时间限制: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,y求出目标解,挺想线性代数里面的。

import java.util.*;
public class Main {
	public static void main(String[] args) {
        Scanner reader=new Scanner(System.in);
        int[][] num=new int[1005][1005];
        int n=reader.nextInt();
        int x=0,y=0;
        for(int i=1;i<=n;i++) {
            int min=10005;
            for(int j=1;j<=n;j++) {
                num[i][j]=reader.nextInt();
                min=Math.min(min, num[i][j]);
                if(num[i][j]==-1) {
                    x=i;
                    y=j;
                }
            }
            if(x!=i)
	            for(int j=1;j<=n;j++) {
	                num[i][j]-=min;
	            }
        }
        int minx=10005,miny=10005;
        for(int i=1;i<=n;i++) {
            if(x!=i)
            	minx=Math.min(minx, num[i][y]);
            if(y!=i)
            	miny=Math.min(miny, num[x][i]);
        }
        System.out.println(minx+miny);
        reader.close();
	}
}
10-07 11:33