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

CODEVS 2485 七夕祭

Sol:

当行的平均值不为整数时,不能均分,列同理。
对行和列分别做一次环形均分纸牌问题。

AC CODE:

#include
#include
#include
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

你可能感兴趣的:(CODEVS 2485 七夕祭 - 贪心+中位数【环形均分纸牌问题】)