https://codeforces.com/contest/1422/problem/B
思路:从头开始一个一个去放,发现对应要相等的位置只有对应的四个角落。边界是在边长都为奇数的中间十字。所以n^2循环把对应四个点都求出来,取他们的中位数就好了。因为中位数到这些数的距离和时最小的。
#include<iostream> #include<vector> #include<queue> #include<cstring> #include<cmath> #include<map> #include<set> #include<cstdio> #include<algorithm> #define debug(a) cout<<#a<<"="<<a<<endl; using namespace std; const int maxn=200; typedef long long LL; LL n,m; LL a[maxn][maxn]; int main(void) { cin.tie(0);std::ios::sync_with_stdio(false); LL t;cin>>t; while(t--) { cin>>n>>m; memset(a,0,sizeof(a)); for(LL i=1;i<=n;i++){ for(LL j=1;j<=m;j++) { cin>>a[i][j]; } } LL midx=(n+1)>>1;LL midy=(m+1)>>1; LL sum=0; for(LL i=1;i<=midx;i++){ for(LL j=1;j<=midy;j++) { vector<LL>tmp({a[i][j],a[n+1-i][j],a[i][m+1-j],a[n+1-i][m+1-j]}); sort(tmp.begin(),tmp.end());LL ave=tmp[1];LL d=0; for(auto v:tmp) d+=abs(ave-v); if((n%2==1&&i==midx)||(m%2==1&&j==midy)) sum+=d/2; else sum+=d; } } cout<<sum<<endl; } return 0; }