七夕祭
要求 只可以交换相邻的摊位 说明每一次交换只会影响一下行或者列中喜爱摊位的变化,所以可以分别去求。
其实在给出数据以后就可以确定行和列哪一个可以在交换摊位后满足题目要求。而去求交换摊位的最小代价可以参考糖果传递(贪心)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;//可能会爆int
const int N=1e5+10;
ll heng[N],lie[N],h,l,f[N];
int n,m,c;
// 计算最小交换代价
ll calc(ll a[],int n,int k){
ll res=0;k=k/n;
for(int i=1;i<=n;i++) f[i]=f[i-1]+a[i]-k;
sort(f+1,f+1+n);
for(int i=1;i<=n;i++) res+=abs(f[i]-f[(n/2)+1]);
return res;
}
int main(){
cin>>n>>m>>c;h=l=c;//可以确定了横列共有多少个喜好摊位
//其实就是c 这步可以省略
while(c--){
int x,y;cin>>x>>y;
heng[x]++,lie[y]++;
}
//判断
if(h%n==0&&l%m==0) cout<<"both "<<calc(heng,n,h)+calc(lie,m,l);
else if(h%n==0) cout<<"row "<<calc(heng,n,h);
else if(l%m==0) cout<<"column "<<calc(lie,m,l);
else cout<<"impossible";
return 0;
}