题目链接
题意:
给你一个数组,问你怎样摆放该数组中的数可以使得数组中相同数之间的距离的最小值最大。
思路:
记录出现次数最大的数并记录有多少个,将他们按照一个固定的排列在数组中每隔一个最大的区间出现一次,这样他们每次出现时相同的数之间的距离都是一样且最小值最大的,剩下的数肯定能填充到这些出现次数最大的数所排列过后的数组中且相同数距离一定会满足大于或等于该距离。
代码:
#include<bits/stdc++.h>
//#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=1e5+3;
const int M=2e4+5;
const double eps=1e-8;
const int mod=998244353;
const int inf=0x7fffffff;
const double pi=3.1415926;
using namespace std;
int flag[N];
signed main()
{
IOS;
int t;
cin>>t;
while(t--)
{
memset(flag,0,sizeof flag);
int n,mx=-inf,sum=1;
cin>>n;
for(int i=0;i<n;i++)
{
int a;
cin>>a;
flag[a]++;
if(mx<flag[a])
{
mx=flag[a];
sum=1;
}
else if(mx==flag[a])
{
sum++;
}
}
n-=sum;
cout<<n/(mx-1)-1<<endl;
}
return 0;
}