CFR 289 B. Polo the Penguin and Matrix ( Greedy )
Problem - 289B - Codeforces
題意:
給 N * M 的整數值矩形,和一個數字 D。求是否可以只透過對值加或減 D 使得矩形最後所有值相同,以及最少步驟數。
解法:
若有解,使所有數成為中位數顯然是最優方案。因此檢查是否每個值都能成為原矩陣值的中位數。
int N, M, D; vvi A; void init(){ cin >> N >> M >> D; A = vvi( N, vi( M ) ); for( int i = 0; i < N; ++i ) for( int j = 0; j < M; ++j ) cin >> A[ i ][ j ]; } void preprocess(){ } void solve(){ vi t; for( int i = 0; i < N; ++i ) for( int j = 0; j < M; ++j ) t.push_back( A[ i ][ j ] ); nth_element( t.begin(), t.begin() + N * M / 2, t.end() ); int gol = t[ N * M / 2 ]; int ans = 0; for( int i = 0; i < t.size(); ++i ){ if( abs( t[ i ] - gol ) % D ){ cout << -1 << endl; return; } ans += abs( t[ i ] - gol ) / D; } cout << ans << endl; }