有 n条绳子,它们的长度分别为 Li?,如果从它们中切割出 mm 条长度相同的绳子,这 m 条绳子每条最长能有多长?
输入格式
第一行两个整数 n 和 m。
接下来 nn 行,每行一个实数,描述了每条绳子的长度 Li?。
数据范围:1≤n≤m≤104,1≤Li?≤10的5次方。
输出格式
切割后每条绳子的最大长度,保留 2 位小数。
Sample Input
4 11
8.02
7.43
4.57
5.39
Sample Output
2.00
解题思路:
坑:一段绳子能截成好几段;
将其转换为整数二分就不会受到精度问题的影响。
先将每一个数值扩大100倍,r尽量开的大一点,最后的结果记得除以100。
代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,m;
const int N=1e5+5;
double l[N];
bool check(double mid)
{
int sum=0;//sum表示能切的个数
for (int i=0;i<n;i++)
{
sum+=l[i]/mid;
}
return sum>=m;
}
int main()
{
cin>>n>>m;
for (int i=0;i<n;i++)
{
cin>>l[i];
l[i]*=100;
}
int l=0,r=1000000000;
while (l<r)
{
int mid=(l+r+1)/2.0;
if (check(mid)) l=mid;
else r=mid-1;
}
printf ("%.2f\n",r*1.0/100);//注意精度
return 0;
}
|