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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮