鏈接:https://www.nowcoder.com/acm/contest/206/B來源:牛客網 題目描述 恬恬有一個nx n的數組。她在用這個數組玩游戲: 開始時,數組中每一個元素都是0。 恬恬會做某些操作。在一次操作中,她可以將某一行的所有元素同時加上一個值,也可以將某一列的所有元素同時加 ...
鏈接:https://www.nowcoder.com/acm/contest/206/B
來源:牛客網
題目描述
恬恬有一個nx n的數組。她在用這個數組玩游戲:開始時,數組中每一個元素都是0。
恬恬會做某些操作。在一次操作中,她可以將某一行的所有元素同時加上一個值,也可以將某一列的所有元素同時加上一個值。
在幾次操作後,一個元素被隱藏了。你能幫助她回憶隱藏的數是幾嗎?
輸入描述:
第一行一個整數n(1≤ n≤ 1000)。ij
接下來n行每行n個整數表示數組a。
第(i+1)行的第j個元素表示a
(aij
=-1或0≤ aij
≤ 10000)。-1表示隱藏的元素。
輸出描述:
僅一個整數表示答案。示例1
輸入
複製3 1 2 1 0 -1 0 0 1 0
輸出
複製1-1的位置置為inf 然後跑每一行每一列的最小值,如果不是0,就該行或列減去最小值。然後肯定-1那個位置還有數,其他位置為0. 然後輸出inf-a[i][j]。
標記思維。
1 #include <iostream> 2 #include <stdio.h> 3 #include <math.h> 4 #include <string.h> 5 #include <stdlib.h> 6 #include <string> 7 #include <vector> 8 #include <set> 9 #include <map> 10 #include <queue> 11 #include <algorithm> 12 #include <sstream> 13 #include <stack> 14 using namespace std; 15 #define rep(i,a,n) for (int i=a;i<n;i++) 16 #define per(i,a,n) for (int i=n-1;i>=a;i--) 17 #define pb push_back 18 #define mp make_pair 19 #define all(x) (x).begin(),(x).end() 20 #define fi first 21 #define se second 22 #define SZ(x) ((int)(x).size()) 23 #define FO freopen("in.txt", "r", stdin); 24 #define debug(x) cout << "&&" << x << "&&" << endl; 25 #define lowbit(x) (x&-x) 26 #define mem(a,b) memset(a, b, sizeof(a)); 27 typedef vector<int> VI; 28 typedef long long ll; 29 typedef pair<int,int> PII; 30 const ll mod=1000000007; 31 const int inf = 0x3f3f3f3f; 32 ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} 33 ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} 34 //head 35 36 const int maxn=1010; 37 int n,a[maxn][maxn]; 38 39 int main() { 40 scanf("%d",&n); 41 rep(i,0,n) { 42 rep(j,0,n) { 43 scanf("%d",&a[i][j]); 44 if(a[i][j]==-1) { 45 a[i][j]=inf;//-1位置設為inf 46 } 47 } 48 } 49 rep(i,0,n) {//找每一行的最小值 50 int minn=inf; 51 rep(j,0,n) { 52 if(a[i][j]<minn) 53 minn=a[i][j]; 54 } 55 if(minn!=0) rep(j,0,n) a[i][j]-=minn;//最小值不為0 減 56 } 57 rep(i,0,n) {//找每一列的最小值 58 int minn=inf; 59 rep(j,0,n) { 60 if(a[j][i]<minn) 61 minn=a[j][i]; 62 } 63 if(minn!=0) rep(j,0,n) a[j][i]-=minn;//最小值不為0 減 64 } 65 //最後肯定是-1的位置還有數(>0) 其他位置為0 66 int ans=0; 67 rep(i,0,n) { 68 rep(j,0,n) { 69 if(a[i][j]>0) 70 ans=inf-a[i][j];//差值即原數 71 } 72 } 73 printf("%d",ans); 74 }
還有這樣的解法,但是不知道為什麼?純找規律?
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[1010][1010]; 4 5 int main(){ 6 int n,i,j,x,y; 7 //freopen("in.txt","r",stdin); 8 scanf("%d",&n); 9 for(i=1;i<=n;i++) 10 for(j=1;j<=n;j++) 11 { 12 scanf("%d",&a[i][j]); 13 if(a[i][j]==-1) x=i,y=j; 14 } 15 int fx,fy; 16 if(x==n) fx=x-1; else fx=x+1; 17 if(y==n) fy=y-1; else fy=y+1; 18 printf("%d\n",a[x][fy]+a[fx][y]-a[fx][fy]); 19 return 0; 20 }
還有一種思想,大佬說是分塊??有一點點明白,就是分成n塊,每行每列加一個數,那麼n塊都加上了,也就是說,這n塊加的數是相同的。 (i+j)%n分塊
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int ans[1001],N; 5 int main() 6 { 7 scanf("%d",&N); 8 int x,t; 9 for(int i=0;i<N;i++) 10 for(int j=0;j<N;j++) 11 { 12 scanf("%d",&x); 13 if(x!=-1) 14 ans[(i+j)%N]+=x; 15 else t=(i+j)%N;//-1的塊 16 } 17 printf("%d\n",ans[(t+1)%N]-ans[t]);//其他塊 - (-1的塊) 18 return 0; 19 }