思维题果然nb.
题意:给你一个 n∗m矩阵,可以对每一列进行上移,或者对每个元素进行修改
使得最后的矩阵满足 q[i][j]=(i−1)∗m+j,1≤i≤n,1≤j≤m
每上移一次某列或者修改某个元素后,操作数加1,现在问你使得矩阵满足要求的最小操作数
题解:遍历每一列求得在上移 0~ n−1次后,回到自己原本位置的元素个数,
之后再计算上移加上修改总操作数的最小值,注意最不理想的情况就是该列所有元素全部修改。
//Author:solego
//2020/02/03 13:46
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
vector<int> q[N];
int x, n, m, Ma, cnt[N];
int getmod(int x) {return (x % n + n) % n;}
int main()
{
scanf("%d%d", &n, &m); Ma = n * m - 1;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++) {
scanf("%d", &x); x--;
q[i].push_back(x);
}
int res = 0;
for(int j = 0; j < m; j++) {
memset(cnt, 0, n * sizeof(int));
int ans = n;
for(int i = 0; i < n; i++) {
if(q[i][j] <= Ma && q[i][j] % m == j) {
int ori = q[i][j] / m; cnt[getmod(i - ori)]++;
}
}
for(int i = 0; i < n; i++) ans = min(ans, i + n - cnt[i]);
res += ans;
}
printf("%d\n", res);
return 0;
}