CODEVS 2485 七夕祭 - 贪心+中位数【环形均分纸牌问题】

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;
}
posted @ 2018-10-14 07:29  dprswdr  阅读(250)  评论(0编辑  收藏  举报