题目
题解思路
行间进行交换 不会导致每列的数值改变,列同理 。 所以我们可以分解两个问题 。
行的总值如果不能被行数整除那肯定无法使他们相等。
列同理。
下面就是 对环形纸牌均分问题。
参考下面推出的公式
公式递推参考文章以及闫总视频
可以得到一个绝对值不等式
我们只要求出每个C如何取中位数就可以得到最小费用了。
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
const int INF = 0x3f3f3f3f;
long long r[100100],c[100100];
long long f[100100];
long long pk[100100];
long long work( int n , long long a[])
{
for (int i = 1 ; i <= n ; i++ )
f[i] = f[i-1] + a[i] ;
if ( f[n]%n != 0 )
return -1;
long long t = f[n]/n;
pk[1] = 0 ;
for (int i = 2 ; i <= n ; i++ )
pk[i] = f[i-1] - (i-1)*t;
sort(pk+1,pk+1+n);
long long ans = 0 ;
for (int i = 1 ;i <= n ; i++ )
ans += abs(pk[i] - pk[(1+n)/2]);
return ans ;
}
int main ()
{
ios::sync_with_stdio(false);
int n,m,T;
cin>>n>>m>>T;
for (int i = 1 ; i <= T ; i++ )
{
int t1 ,t2 ;
cin>>t1>>t2;
r[t1]++, c[t2]++;
}
long long t1 = work( n , r );
long long t2 = work( m , c );
if ( t1 != -1 && t2 != -1 )
{
cout<<"both "<<t1+t2<<"\n";
}else if ( t1 == t2 && t1 == -1 )
{
cout<<"impossible\n";
}else if ( t1 == -1 )
{
cout<<"column "<<t2<<"\n";
}else
{
cout<<"row "<<t1<<"\n";
}
return 0 ;
}