NC229023. 分组
描述
输入描述
第一行两个数个数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; }