參考:Codeforces Round #615 (Div. 3) Editorialc++
其實這個算法的本質也就是暴力,只不過是更爲有效的暴力算法
每一列之間不互相影響,那麼只須要求出每一列的最小值便可url
對於每一列:進行貪心,具體的貪心代碼:spa
vector<int> cnt(n+5); for(int j=1;j<=n;++j) if(a[j][i]%m==i-1) //是否屬於該列 { int pos=a[j][i]/m; //屬於該列上第幾個位置 if(pos<n) cnt[(j-pos-1+n)%n]++; //屬於某一個循環層 } int t=inf; for(int j=0; j<=n-1; ++j) t=min(t,n-cnt[j]+j);
代碼:.net
// Created by CAD on 2020/1/25. #include <bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n,m; cin>>n>>m; vector<vector<int> > a(n+5,vector<int>(m+5)); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) cin>>a[i][j],a[i][j]--; int ans=0; for(int i=1;i<=m;++i) { vector<int> cnt(n+5); for(int j=1;j<=n;++j) if(a[j][i]%m==i-1) { int pos=a[j][i]/m; if(pos<n) cnt[(j-pos-1+n)%n]++; } int t=inf; for(int j=0; j<=n-1; ++j) t=min(t,n-cnt[j]+j); ans+=t; } cout<<ans<<endl; return 0; }