To buy network cables, the Judging Committee has contacted a local network solutions provider with a request to sell for them a specified number of cables with equal lengths. The Judging Committee wants the cables to be as long as possible to sit contestants as far from each other as possible.
The Cable Master of the company was assigned to the task. He knows the length of each cable in the stock up to a centimeter,and he can cut them with a centimeter precision being told the length of the pieces he must cut. However, this time, the length is not known and the Cable Master is completely puzzled.
You are to help the Cable Master, by writing a program that will determine the maximal possible length of a cable piece that can be cut from the cables in the stock, to get the specified number of pieces.
If it is not possible to cut the requested number of pieces each one being at least one centimeter long, then the output file must contain the single number "0.00" (without quotes).
4 11 8.02 7.43 4.57 5.39
Sample Output
2.00
题目大意:
给出几条绳,求出能剪成给定条数的最大长度,不过见不到给定的条数,则输出0.00;
思路:
寻找一个数,明显是二分,所以我们要确定二分的对象,这里明显是要求的绳子长度。这里有一个坑点和玄学点,坑点就是不能四舍五入啊,也就是不能直接用%.3f输出,玄学点就是二分那里不能写成精度,要直接写循环次数(别问我为什么,我也不知道)
下面是ac代码:
#include<cstdio>
#include<string.h>
#include<cmath>
#define inf 1000000.0
using namespace std;
double a[10000];
int n,s;
int fuck(double x)
{
int sum=0;
for(int i=0;i<n;i++)
{
sum+=(int)(a[i]/x);
}
if(sum>=s)
return 1;
else
return 0;
}
int main()
{
while(scanf("%d%d",&n,&s)==2&&n&&s)
{
for(int i=0;i<n;i++)
scanf("%lf",&a[i]);
double low=0,high=inf,mid;
for(int i=0;i<=100;i++)
{
mid=(low+high)/2;
if(fuck(mid))
low=mid;
else
high=mid;
}
low=floor(low*100)/100;
printf("%.2f\n",low);
}
return 0;
}