Board
阿新 • • 發佈:2018-11-08
連結:https://www.nowcoder.com/acm/contest/206/B
來源:牛客網
題目描述
恬恬有一個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
有點坑這道題,一開始想了兩個思路都判了好多秒才錯,感覺差點什麼特例沒判,最後隊友終於找出,差點自閉
思路就是每一行每一列依次刪除每一行/列的最小值,隱藏數的那一行和列就不刪,刪到最後剩下就是隱藏數和所在的那一行和列,把行和列的數加起來就是隱藏數,然後坑點就是一開始直接加g[x][0] g[0][y] 沒有考慮到如果隱藏數就是在0這個位置呢,就錯了
程式碼:
#include <cstdio>
#include <algorithm>
using namespace std;
int n;
const int N=1005;
int g[N][N];
int hang[ N];
int lie[N];
int main(void){
scanf("%d",&n);
int x,y;
for(int i=0;i<n;i++){
int Min=0x3f3f3f3f;
for(int j=0;j<n;j++){
scanf("%d",&g[i][j]);
if(g[i][j]==-1){
x=i;
y=j;
continue;
}
Min=min(Min,g[i][j]);
}
hang[i]=Min;
}
for(int i=0;i<n;i++){
bool flag=true;
for(int j=0;j<n;j++){
if(g[i][j]==-1){
flag=false;
break;
}
}
if(flag){
for(int j=0;j<n;j++){
g[i][j]-=hang[i];
}
}
}
for(int j=0;j<n;j++){
int Min=0x3f3f3f3f;
for(int i=0;i<n;i++){
Min=min(Min,g[i][j]);
}
bool flag=true;
for(int i=0;i<n;i++){
if(g[i][j]==-1){
flag=false;
break;
}
}
if(flag){
for(int i=0;i<n;i++){
g[i][j]-=Min;
}
}
}
// for(int i=0;i<n;i++){
// for(int j=0;j<n;j++){
// printf("%d ",g[i][j]);
// }
// printf("\n");
// }
int fx=0;
for(int j=0;j<n;j++){
if(g[x][j]!=-1){
fx=g[x][j];
break;
}
}
int fy=0;
for(int i=0;i<n;i++){
if(g[i][y]!=-1){
fy=g[i][y];
break;
}
}
//printf("%d\n",g[x][0]+g[0][y]);
printf("%d\n",fx+fy);
return 0;
}