dd当上了宣传委员,开始组织迎新晚会,已知班里有nn个同学,每个同学有且仅有一个擅长的声部,把同学们分成恰好mm组,为了不搞砸节目,每一组里的同学都必须擅长同一个声部,当然,不同组同学擅长同一个声部的情况是可以出现的,毕竟一个声部也可以分成好几个part进行表演,但是他不希望出现任何一组的人过多,否则可能会导致场地分配不协调,也就是说,她希望人数最多的小组的人尽可能少,除此之外,对组内人员分配没有其他要求,她希望你告诉她,这个值是多少,如果无法顺利安排,请输出-1
输入描述:
第一行两个数个数n,m(1≤m≤n≤100000)表示人数
接下来一行n个数,a[i](1 ≤ a [ i ] ≤ n)表示第i个学生的擅长声部
输出描述:
输出一个数,表示人数最多的小组的人数
示例1
输入
5 3
2 2 3 3 3
输出
2
思路
二分
代码
#include<stdio.h>
#include<string.h>
#include<set>
#include<algorithm>
using namespace std;
set<int>s;
int n,m;
int a[100010],book[100010];
int check(int x)
{
int res=0;m
for(int i=1; i<=n; i++)
{
if(book[i])
res+=(book[i]-1)/x+1;
}
if(res<=m)
return 1;
else
return 0;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
book[a[i]]++;
s.insert(a[i]);
}
if(s.size()>m)
printf("-1\n");
else
{
int l=1,r=n;
while(l+1<r)
{
int mid=(l+r)/2;
if(check(mid))
r=mid;
else
l=mid;
}
printf("%d\n",r);
}
return 0;
}