地址:http://codeforces.com/contest/1366/problem/C
题意:
n*m的01矩阵
把所有的从(1,1)到(n,m)路线变为回文,最少需要修改几处,操作:0<->1
解析:
可以得到结论,对于(x,y),从(1,1)到它的步数为:x+y-2
那么假设当前步数为k,它们的共同目的地是(n,m),而且到(n,m)的步数相同为:n+m-2-k
所以从(1,1)到某些位置的步数相同,就把它们加入到同一个集合里,统计它们0,1各含多少,要想与对应的位置:n+m-2-k相同,取小的01数目即可。
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> using namespace std; const int maxn=200; typedef long long ll; int mp[maxn][maxn],a[maxn][3]; int main() { int t; cin>>t; while(t--) { int n,m; memset(mp,0,sizeof(mp)); memset(a,0,sizeof(a)); cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>mp[i][j]; int md=i+j-2; a[md][mp[i][j]]++; } } int sum=0; int len=n+m-2; int i=0,j=len; for(;j>i;i++,j--) //j>i而不是j>=i,因为同一个位置,不需要变化,它肯定自己等于自己 { sum+=min(a[i][0]+a[j][0],a[i][1]+a[j][1]); } cout<<sum<<endl; } }
Educational Codeforces Round 89 (Rated for Div. 2) C-Palindromic Paths
原文:https://www.cnblogs.com/liyexin/p/13110015.html