题目描述
佳佳邀请了M个同学到家里玩。为了招待客人,她需要将巧克力分给她的好朋友们。她有N(1<=N<=5000)块巧克力,但是大小各不一样,第i块巧克力大小为为1*Xi(1<=i<=N,1<=Xi<=10000)
为了公平,她需要让每人所分得的巧克力大小一样,而且为了礼貌,巧克力是一整块地分给客人。所以她需要将巧克力分成大小为S的M块,而且使得S最大。但她很忙还要照顾她的客人,所以就将任务交给你了,你需要求出S。
输入格式
第一行,N,M
下接N行为N块巧克力的大小。
输出格式
仅有一行,为巧克力大小S。
输入样例
9 5
1
2
3
4
5
6
7
8
9
输出格式
5
题解 & 吐槽
这题是二分答案的裸题。
首先二分S,然后贪心的算出最多能分成几块巧克力,如果大于等于,说明S是可行的,因为要求最大S的缘故,移动左边界,反之移动右边界。
然后L在最小情况为最小的巧克力分成M段的值,R等于全部巧克力的长度除M。
然后接下来就是二分的模板了。
蒟蒻丑丑的代码QAQ
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=5000+5,inf=1e9;
int n,m,l=inf,r,mid;
int num[maxn];
inline int check(int x)
{
int sum=0;
for(register int i=1;i<=n;++i)
{
sum+=num[i]/x;
}
return sum>=m;
}
int main()
{
scanf("%d %d",&n,&m);
for(register int i=1;i<=n;++i)
{
scanf("%d",&num[i]);
l=min(l,num[i]);
r+=num[i];
}
l/=m;
r/=m;
while(l<r)
{
mid=l+r+1>>1;
if(check(mid))
{
l=mid;
}
else
{
r=mid-1;
}
}
printf("%d\n",l);
return 0;
}