信友队题目求调
  • 板块学术版
  • 楼主xk2013
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/4/28 19:26
  • 上次更新2024/4/28 21:21:43
查看原帖
信友队题目求调
998662
xk2013楼主2024/4/28 19:26
## 题目描述
一条街道安装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;
}

2024/4/28 19:26
加载中...