0w1

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;
}