列表

详情


NC229023. 分组

描述

当上了宣传委员,开始组织迎新晚会,已知班里有个同学,每个同学有且仅有一个擅长的声部,把同学们分成恰好组,为了不搞砸节目,每一组里的同学都必须擅长同一个声部,当然,不同组同学擅长同一个声部的情况是可以出现的,毕竟一个声部也可以分成好几个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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 18ms, 内存消耗: 952K, 提交时间: 2023-04-01 19:18:29

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,a[N];
int d(int x)
{
	int sum=0;
	for(int i=1;i<=n;i++)
	{
		sum+=(a[i]+x-1)/x;
	}
	return sum<=m;
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		int x;
		scanf("%d",&x);
		a[x]++;
	}
	int l=1,r=n;
	while(l<r)
	{
		int mid=l+r>>1;
		if(d(mid)) r=mid;
		else l=mid+1;
	}
	if(d(r)) cout<<r<<endl;
	else cout<<-1<<endl;
	return 0;
}

C++ 解法, 执行用时: 18ms, 内存消耗: 552K, 提交时间: 2021-11-06 17:20:30

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int t[N];
int main()
{
	int n,m,x;
	cin>>n>>m;
	for(int i=1;i<=n;i++) {
		cin>>x;
		t[x]++;
	}
	int l=1,r=n,ans=-1;
	while(l<=r) {
		int mid=l+(r-l>>1),tot=0;
		for(int i=1;i<=n;i++)
			tot+=(t[i]+mid-1)/mid;
			if(tot<=m)
				ans=mid,r=mid-1;
			else
				l=mid+1;
	}
	cout<<ans<<endl;
	return 0;
}

上一题