## 题目描述
一条街道安装WIFI,需要放置M个TP-LINK路由器。整条街道上一共有N户居民,分布在一条直线上,每一户居民必须被至少一台TP-LINK路由器覆盖到。现在的问题是所有TP-LINK路由器的覆盖半径是一样的,我们希望用覆盖半径尽可能小的路由器来完成任务,因为这样可以节省成本。
## 输入格式
输入文件第一行包含两个整数M和N,以下N行每行一个整数H(i)表示该户居民在街道上相对于某个点的坐标。
## 输出格式
输出文件仅包含一个数,表示最小的覆盖半径,保留一位小数。
#include <cstdio>
#include <map>
int m, n;
double a[101];
bool check(double mid);
int main(void)
{
double l = 0, r = 0x3f3f3f3f;
scanf("%d %d", &m, &n);
for (int i = 0; i < n; i++)
{
scanf("%lf", &a[i]);
}
while (l + 10e-4 < r)
{
double mid = (l + r) / 2;
if (check(mid))
{
r = mid;
}
else
{
l = mid + 10e-4;
}
}
printf("%.1lf", l);
return 0;
}
bool check(double mid)
{
int cnt = 0;
std::map <double, bool> mp;
for (int i = 0; i < n; i++)
{
if (!mp[a[i]])
{
for (int j = int(a[i] - mid); j <= a[i] + mid; j++)
{
mp[j] = true;
}
cnt++;
}
}
return cnt <= m;
}