1.均分纸牌:
思路;一开始就让每个人手中的纸牌减去平均数,并且最终让每个人手里都恰好有0张卡牌,那就是,求减掉平均值之后的前缀和数组,再求每个值的绝对值。
2.环形分牌:

include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=100010;
int x[maxn],y[maxn];
long long s1[maxn],s2[maxn];

int main(){
    int N,M,T;
    cin>>N>>M>>T;
    int a,b;
    for(int i=1;i<=T;i++){
        cin>>a>>b;
        x[a]++;
        y[b]++;
    }
    
    if(T%M!=0 && T%N!=0){cout<<"impossible\n";return 0;}
    
    for(int i=1;i<=N;i++) x[i]-=T/N;
    for(int i=1;i<=M;i++) y[i]-=T/M;
    
    long long ans=0;
    
    if(T%N==0){
        for(int i=1;i<=N;i++) s1[i]=s1[i-1]+x[i];
        sort(s1+1,s1+N+1);
        long long t=s1[(N+1)>>1];
        for(int i=1;i<=N;i++){
            if(t-s1[i]>=0) ans=ans+t-s1[i];
            else ans=ans+s1[i]-t;
        }
    }
    if(T%M==0){
        for(int i=1;i<=M;i++) s2[i]=s2[i-1]+y[i];
        sort(s2+1,s2+M+1);
        long long t=s2[(M+1)>>1];
        for(int i=1;i<=M;i++){
            if(t-s2[i]>=0) ans=ans+t-s2[i];
            else ans=ans+s2[i]-t;
        }
    }
    
    if(T%N==0 && T%M==0) cout<<"both ";
    else if(T%N==0) cout<<"row ";
    else cout<<"column ";
    cout<<ans<<"\n";
    return 0;
}
 posted on 2019-07-07 16:27  谁是凶手1703  阅读(94)  评论(0)    收藏  举报