Description
在大一的时候,XCC还在stu union打酱油~~~~和十三还有奶子他们去外面吃吃喝喝是常有的事。
大家都知道空腹喝酒是有害肚子滴,所以呢,要买一些面包来下酒。不过我们有个习惯,
就是所有的n个人,每个人分得的面包必须长度相等(长度相等的面包的量是一样的),
同时捏~给每个人分面包时,分得的小面包必须是来自同一块面包的,即不能把两个不同面包各切一部分下来凑合成一份面包来分。
现在一起来的有n个人,买了m个面包,求每人分得的最长面包长度。
输入格式
第一行是人数 n 和面包数目 m (3<= n <= 16 , 1 <= m <= 100),第二行 m 个数字表示 m 个面包的长度 L ,均为整数( 1 <= L <= 1000000)
输出格式
每人分得的最长面包长度,保留2位小数
输入样例
3 3
3 3 3
输出样例
3.00
提示
注意题目描述
解题思路
最后的长度只能介于最短面包和最长面包的长度之间,对最短和最长的长度区间进行二分搜索,
每次确定一个长度后遍历数组确定在满足题意的条件下是否够分n份
#include<stdio.h>
int main()
{
int n, m, total, max = -1, f[102];
double start, end, mid;
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i ++)
{
scanf("%d", &f[i]);
if(f[i] > max)
max = f[i];
}
// 最短直接取0可以少写几行代码
start = 0;
end = max;
while(end - start > 0.000001)
{
total = 0;
mid = (start + end) / 2;
for(int i = 0; i < m; i ++)
total += f[i] / mid;
if(total >= n)
start = mid;
else
end = mid;
}
printf("%.2lf\n", mid);
return 0;
}