题目描述
现有N条绳子,它们的长度分别为L1,L2,„„,Ln,如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长?
输入
共有两行,第一行包含两个正整数N和K,用一个空格分隔;第二行包含N个数,依次表示N条绳子的长度,两数间用一个空格分隔。每条绳子长度的小数不超过两位。(1<=N<=1000,1<=K<=1000,1<=Li<=10000)
输出
仅包含一个数,表示所得K绳子的最大长度。答案四舍五入保留小数点后两位。
样例输入
4 11
8.02 7.43 4.57 5.39
样例输出
2.00
本题的基本思路。我们可以运用二分查找法。我们可以用二分查找,查找到一个数,将其中每条绳子与之相除得到能剪成多少根绳子。算出总的绳子数。然后,比较判断。如果绳子数大于等于需要的绳子数,那么我们可以继续二分,不过将起点改成之前的中点(即上次的查找长度)。如果,绳子数小于需要的绳子数,我们继续二分,不过将其终点改成上次查找的中点。继续查找。
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
double a[1005];
int main()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++){
scanf("%lf",&a[i]);
}
double l=0.001,r=10000;
for(int i=0;i<100;i++){
double mid=(l+r)/2;
int t=0;
for(int j=0;j<n;j++)
t+=(int)(a[j]/mid);
if(t>=k) l=mid;
else r=mid;
}
printf("%.2lf\n",l);
}