这道题目让我懂得了二分搜索这个技巧,同时也让我知道了整数二分和小数二分的区别。
#include "set"
#include "map"
#include "queue"
#include "stack"
#include "cmath"
#include "cstdio"
#include "cstdlib"
#include "iostream"
#include "algorithm"
#define EPS 1e-10
#define MAX_N 100005
#define Pi acos(-1.0)
#define INF 0x3f3f3f3f
using namespace std;
int N, K;
double a[MAX_N];
int C(double x)
{
int res = 0;
for (int i = 0; i < N; i++)
res += (int)(a[i] / x);
return res ;
}
int main ()
{
//freopen ("in.txt", "r", stdin);
//freopen ("out.txt", "w", stdout);
while (~scanf("%d%d", &N, &K))
{
for (int i = 0; i < N; i++)
scanf("%lf", &a[i]);
double l = 0, r= INF, m;
//while (r - l > EPS)
for (int i = 0; i < 100; i++)//EPS设置的太小会死循环,太大会wa,所以用循环次数来控制精度
{
m = (l + r) / 2;
int t = C(m);
if (t < K) r = m;//小数二分不用-1
else l = m;
}
printf("%.2f\n", floor(r * 100) / 100);//不能直接输出r,因为会四舍五入
}
return 0;
}