CODEVS 2485 七夕祭
Sol:
当行的平均值不为整数时,不能均分,列同理。
对行和列分别做一次环形均分纸牌问题。
AC CODE:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100000 + 100;
int read(){
int x=0,f=1;char ch=‘ ‘;
while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
while(ch<=‘9‘&&ch>=‘0‘){x=(x<<3)+(x<<1)+(ch^‘0‘);ch=getchar();}
return x*f;
}
typedef long long ll;
int R[N],C[N];
//R=每行感兴趣的摊点数 C=每列感兴趣的摊点数
ll sR,sC;
//sR=R的和 sC=C的和
ll SR[N],SC[N];
//SR_i=sigma_{j=1}^{i} R_j-aveR;
int main(){
int n,m,t;n=read();m=read();t=read();
for(int i=1;i<=t;i++){
int x,y;x=read();y=read();
R[x]++,C[y]++;sR++;sC++;
}
bool fR=1,fC=1;
if(sR%n!=0) fR=0;
if(sC%m!=0) fC=0;
ll resR=0,resC=0;
if(fR){
ll aveR=sR/n;
for(int i=1;i<=n;i++) SR[i]=SR[i-1]+R[i]-aveR;
sort(SR+1,SR+n+1);
ll mid=SR[n/2+1];
for(int i=1;i<=n;i++) resR+=abs(SR[i]-mid);
}
if(fC){
ll aveC=sC/m;
for(int i=1;i<=m;i++) SC[i]=SC[i-1]+C[i]-aveC;
sort(SC+1,SC+m+1);
ll mid=SC[m/2+1];
for(int i=1;i<=m;i++) resC+=abs(SC[i]-mid);
}
if((!fR)&&(!fC)) printf("impossible");
else if((fR)&&(!fC)){
printf("row ");printf("%lld",resR);
}
else if((!fR)&&(fC)){
printf("column ");printf("%lld",resC);
}
else if(fR&&fC){
printf("both ");printf("%lld",resR+resC);
}
return 0;
}
原文地址:https://www.cnblogs.com/Loi-Brilliant/p/9785051.html
时间: 2024-10-22 18:54:06