题目大意
解题思路
解法一: 限制二分次数,使小数达到一定精度。
解法二:由于是两位小数,因此用整数模拟小数,然后对整数进行二分搜索。
代码
- 解法一
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
const int MAX = 10005;
int main()
{
int N, K;
double L[MAX];
while(cin >> N >> K)
{
for(int i=0; i<N; i++)
cin >> L[i];
double l = 0;
double r = 1000000.1;
for(int i=0; i<100; i++)
{
double mid = (l+r) / 2;
int ans = 0;
for(int j=0; j<N; j++)
{
ans += floor(L[j]/mid);
}
if(ans >= K)
l = mid;
else
r = mid;
}
if(l == 0)
printf("0.00\n");
else
printf("%.2lf\n", floor(l*100)/100);
}
return 0;
}
- 解法二
#include<iostream>
#include<stdio.h>
using namespace std;
const int L = 1;
const int R = 10000000 + 1;
const int MAX = 100005;
int N;
int K;
double A[MAX];
int main()
{
while(cin >> N >> K)
{
for(int i=0; i<N; i++)
cin >> A[i];
int l = L;
int r = R;
int ans = -1;
while(l < r)
{
int mid = (l+r)/2;
double tmp = mid * 1.0 / 100;
int num = 0;
for(int i=0; i<N; i++)
num += (int)(A[i] / tmp);
if(num >= K)
{
ans = max(ans, mid);
l = mid+1;
}
else
r = mid;
}
if(ans > 0)
printf("%.2lf\n", 1.0*ans/100);
else
printf("0.00\n");
}
return 0;
}
知识点
- 小数相除向下取整使用:
floor(num1/num2)
. - 小数二分
lb
直接赋值为mid
,整数二分需要赋值为mid+1
- 对于此类的长度组成类问题,一定要记得向下取整, 即此行
floor(l*100)/100