七夕祭

七夕祭

要求 只可以交换相邻的摊位 说明每一次交换只会影响一下行或者列中喜爱摊位的变化,所以可以分别去求。
其实在给出数据以后就可以确定行和列哪一个可以在交换摊位后满足题目要求。而去求交换摊位的最小代价可以参考糖果传递(贪心)

#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; 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值