C - Pinkie Pie Eats Patty-cakes(二分+模拟)

 

给出 n 个数,可以将所有数任意排列,问两个相同的数之间的距离最大的最小值是多少 

题目也就是问,两个相同的数的最大距离是多少,其中这两个相同的数中间没有任何一个数等于他们两个

const int N=2e5+5;
 
    int n,m,t;
    int i,j,k;
    int a[N];
    int pos[N];
    int maxx;
 
bool C(int x)//间隔为 x
{
    int s=1;
    for(int i=1;i<=n;i++){//枚举题目中 ai 的范围
        if(a[i]){
            int tmp=a[i];
            for(int j=s;j<=n && tmp;j+=x+1){//将 n 个位置填上
                tmp--;
                pos[j]=i;
            }
            if(tmp) return 0;
            s++;
        }
        else break;
    }
    return 1;
}
int main()
{
    //IOS;
    rush(){
        sd(n);
        ms(a,0);
        for(i=1;i<=n;i++){
            int x;
            sd(x);
            a[x]++;
        }
        sort(a+1,a+1+n,greater<int>());
        int l=0,r=n,ans;
        while(r>=l){
            int mid=l+r>>1;
            if(C(mid)) ans=mid,l=mid+1;
            else r=mid-1;
        }
        pd(ans);
    }
    //PAUSE;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/C_Dreamy/article/details/107875833