101611G God of Winds 思路思路思路 2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest
阿新 • • 發佈:2018-12-11
題意:
給定一個n*m的網格,每跳邊有一個初始值,在一些格子裡填數,會對這個格子的4條邊有影響
問是否存在填數方案使得所有的邊值為0;
思路:
對於每一列格子的橫邊,若是加和為0,那一定存在一種解使得這一列橫邊為0,
對於每一行格子的豎邊,若是加和為0,那一定存在一種解使得這一行豎邊為0,
可以看作一組方程式的行列式
若滿足上述兩個條件,即有解
另一種思路:若有解,即有無數種解,因為某個格子加一,其餘的所有格子的絕對值加一就能保證可行,我們可以先假設第一個格子填一個數0,然後對後面的所有格子填數,最後check可行性
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1000 + 7; int n, m; int a[maxn/2][maxn]; int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m*2; ++j) { scanf("%d", &a[i][j]); } } bool ok = true; ll sum = 0; for(int i = 1; i < 2*m; i += 2) { sum = 0; for(int j = 1; j <= n; ++j) { sum += a[j][i]; } if(sum != 0) { ok = false; break; } } for(int i = 1; i <= n; ++i) { sum = 0; for(int j = 2; j <= 2*m; j += 2) { sum += a[i][j]; } if(sum != 0) { ok = false; break; } } if(!ok) { puts("No"); } else { puts("Yes"); } return 0; }