分弹珠
描述
一家弹珠厂向一所幼儿园捐赠了一些弹珠,弹珠一共有M种颜色,每颗弹珠都有一种颜色。老师需要把所有的弹珠分给 N个孩子。每个孩子得到的所有弹珠都必须是相同的颜色,而且可以有一些孩子一颗弹珠也没得到。 我们把嫉妒值定义为分给一个孩子最多的弹珠数量。请你帮助老师分弹珠,使得嫉妒值最小。 例如,如果有4个红色的弹珠(RRRR)和7个蓝色的弹珠(BBBBBBB),分给5个孩子,那么我们可以这样划分:RR,RR,BB,BB,BBB。这样分的嫉妒值为3,是最小的。
输入
输入共 M+1行。 第一行包含两个正整数 N,M分别表示孩子数和弹珠的颜色总数。 接下来 M 行的第i行包含一个正整数 x(x∈[1,10^9]), 表示有x个颜色为i的弹珠。 1≤M≤3×105,1≤N≤109,M≤N。
输出
输出一行一个整数,表示最小的嫉妒值。
样例
输入
5 2
7
4
输出
3
二分答案,枚举嫉妒值,从1到每种颜色弹珠的最大值(样例中为7)
完整代码
#include <bits/stdc++.h>
using namespace std;
int n,m,a[300010],l=1,r=-1,ans;
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++)cin>>a[i],r=max(r,a[i]);
while(l<=r){
int kobe=0,mid=(l+r)/2;
for(int i=1;i<=m;i++)kobe+=ceil(1.0*a[i]/mid);
if(kobe<=n)ans=mid,r=mid-1;
else l=mid+1;
}
cout<<ans;
return 0;
}