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;
}
本文介绍了一个关于组织迎新晚会的问题,其中涉及到将具有相同声部的学生分组,使得每组成员都擅长同一声部,且组内人数不超过一定限制。通过二分查找算法确定最大的小组人数,确保不超过场地限制。若无法合理分配,则输出-1。该问题主要考察了数据结构和算法的应用。
970

被折叠的 条评论
为什么被折叠?



