先上题面
题目大意
这道题看着很高大上,题意其实比较简单,就是在一条直线上找到一些点,使每个岛都在它们的范围内。
思路
其实这道题只需要把二维的坐标系(x,y)转换成一维的数轴(x)就简单了,其他的就是在那些区间之中找到一些点,使每个区间都至少有一个点且点最少就可以了。
代码
我知道你们只看这里,所以我就只贴主体代码了[狗头]
//二维转一维
for(int i=1;i<=n;i++)
{
int x,y;//每个点的坐标
cin>>x>>y;//输入
if(y>d)//如果他的高度超过雷达能探测的范围d
{
cout<<-1;//不满足条件,输出-1
return 0;//就直接结束
}
else if(y==d)//如果与他的高度正好相等,那么在它正下方的一定是最优解(垂线段最短)
{
f[i].l=x;//把雷达的范围定在x点
f[i].r=x;//把雷达的范围定在x点
}
else
{
f[i].l=ceil(x-sqrt(d*d-y*y));//否则用勾股定理求出雷达范围
f[i].r=floor(x+sqrt(d*d-y*y));//否则用勾股定理求出雷达范围
}
}
不可以复制哦
下面的就比较简单了,代码我就不贴了。
2023.7.14 16:05更新
