题目链接:B - Light It Up
题意:输入n个人和k个发光点(可以发光的人),该发光点可以照亮的范围为半径为R的圆,找出每个人至少被一个灯照亮的最小R。
分析:在除发光点之外的所有点中找到至发光点的最小距离,然后输出所有距离的最大值。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int n,k;
cin>>n>>k;
ll a[k+1],x[n+1],y[n+1];//从1开始回避下标问题
int vis[n+1]= {0}; //记录k个人坐标,以便循环跳过
for(int i=1; i<=k; i++)
cin>>a[i],vis[a[i]]=1;
for(int i=1; i<=n; i++)
cin>>x[i]>>y[i];
double maxd=INT_MIN,mind=INT_MAX;
for(int j=1; j<=n; j++)
{
if(vis[j]) continue;//若为发光点跳过
mind=INT_MAX;//求每个j对应k个人中的距离最小值,需更新最小距离
for(int i=1; i<=k; i++)
{
mind=min( sqrt((x[j]-x[a[i]])*(x[j]-x[a[i]])+(y[j]-y[a[i]])*(y[j]-y[a[i]])),mind);
}
maxd=max( maxd,mind);
}
printf("%.5lf\n",maxd);//精度10^-5以上
return 0;
}