返回顶部

Codeforces Round #177 (Div. 2) B. Polo the Penguin and Matrix (贪心,数学)

  • 题意:给你一个\(n\)x\(m\)的矩阵,可以对矩阵的所有元素进行\(\pm d\),问能否使得所有元素相等.

  • 题解:我们可以直接记录一个\(n*m\)的数组存入所有数,所以\((a_1+xd)=(a_2+yd)=...=(a_{n*m}+zd)\),我们但看任意一个等式可得:\(a_{x}+nd=a_{y}+md\),移项得:\(a_x-a_y=(n-m)d\),所以可以推出任意两个元素的值一定是\(d\)的倍数,再对数组排序取中位数后直接求答案就好了.

  • 代码:

    int n,m,d;
    vector<int> v;
     
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        cin>>n>>m>>d;
            
        for(int i=1;i<=n*m;++i){
            int x;
            cin>>x;
            v.pb(x);
        }
        
        sort(v.begin(),v.end());
     
        bool flag=true;
        for(int i=0;i<n*m;++i){
            for(int j=i+1;j<n*m;++j){
                if(abs(v[i]-v[j])%d){
                    flag=false;
                    break;
                }
            }
            if(!flag) break;
        }
        
        if(!flag){
            cout<<-1<<endl;
            return 0;
        }
     
        int mid=v[n*m/2];
     
        int ans=0;
     
        for(int i=0;i<n*m;++i){
            ans+=abs(v[i]-mid)/d;
        }
     
        cout<<ans<<endl;
     
        return 0;
    }
    
posted @ 2020-11-02 12:41  Rayotaku  阅读(67)  评论(0编辑  收藏  举报