暴力枚举+数学——1267J

 冲就完事了

/*
把每种颜色的数量统计出来,并求出最小的数量Min
从Min+1开始降序枚举s,暴力判就行了 
*/
#include<bits/stdc++.h>
using namespace std;
#define N 2000006

int n,a[N],tot;
map<int,int>mp;
map<int,int>::iterator it;
int cnt[N];

inline int judge(int x,int s){ 
    int k=x/s,mod=x%s;
    if(mod==0)return k;
    if(s-1-mod<=k)return k+1;
    return 0; 
}

int main(){
    int t;cin>>t;
    while(t--){
        mp.clear();
        cin>>n;
        for(int i=1;i<=n;i++){
            int x;scanf("%d",&x);
            mp[x]++;
        }
            
        tot=0;
        for(it=mp.begin();it!=mp.end();it++)cnt[++tot]=it->second;
        
        int Min=0x3f3f3f3f;
        for(int i=1;i<=tot;i++)Min=min(Min,cnt[i]);
        
        for(int s=Min+1;s>=2;s--){
            int flag=1,res=0;
            for(int i=1;i<=tot;i++){
                if(judge(cnt[i],s)==0){flag=0;break;}
                else res+=judge(cnt[i],s);
            }
            if(flag){cout<<res<<'\n';break;}
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/12285608.html