Educational Codeforces Round 89 (Rated for Div. 2) C-Palindromic Paths

地址: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;
    }    
}
原文地址:https://www.cnblogs.com/liyexin/p/13110015.html