codeforce #514 D. Nature Reserve

探讨如何在森林中设计一个圆形保护区,以最小半径覆盖所有动物栖息地并仅与河流相切一次。解决方法涉及坐标转换、二分查找及判断圆区间交集,确保保护区既保护动物又不影响河流交通。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

D. Nature Reserve

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

There is a forest that we model as a plane and live nn rare animals. Animal number ii has its lair in the point (xi,yi)(xi,yi). In order to protect them, a decision to build a nature reserve has been made.

The reserve must have a form of a circle containing all lairs. There is also a straight river flowing through the forest. All animals drink from this river, therefore it must have at least one common point with the reserve. On the other hand, ships constantly sail along the river, so the reserve must not have more than one common point with the river.

For convenience, scientists have made a transformation of coordinates so that the river is defined by y=0y=0. Check whether it is possible to build a reserve, and if possible, find the minimum possible radius of such a reserve.

Input

The first line contains one integer nn (1≤n≤1051≤n≤105) — the number of animals.

Each of the next nn lines contains two integers xixi, yiyi (−107≤xi,yi≤107−107≤xi,yi≤107) — the coordinates of the ii-th animal's lair. It is guaranteed that yi≠0yi≠0. No two lairs coincide.

Output

If the reserve cannot be built, print −1−1. Otherwise print the minimum radius. Your answer will be accepted if absolute or relative error does not exceed 10−610−6.

Formally, let your answer be aa, and the jury's answer be bb. Your answer is considered correct if |a−b|max(1,|b|)≤10−6|a−b|max(1,|b|)≤10−6.

Examples

input

Copy

1
0 1

output

Copy

0.5

input

Copy

3
0 1
0 2
0 -3

output

Copy

-1

input

Copy

2
0 1
1 1

output

Copy

0.625

Note

In the first sample it is optimal to build the reserve with the radius equal to 0.50.5 and the center in (0, 0.5)(0, 0.5).

In the second sample it is impossible to build a reserve.

In the third sample it is optimal to build the reserve with the radius equal to 5858 and the center in (12, 58)(12, 58).

 

题意:给出n个点,找到一个圆,使得这个圆的半径最小,并且与X轴相切,并且包含n个点

思路:

1.二分找半径r,那么我们要判断r是否合法,那么可以根据已给出的r求出每个圆圆心的x的坐标区间(y坐标永远是R),那么只要所有的点的圆的x的区间至少有一个交点,那么当前的r是合法的,那么减小r的取值,如果不合法,那么说明给的R太小了,把R变大即可

#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define maxn 100001 +10
#define INF 0xfffffff
using namespace std;	
int n;
struct node{
	double x,y;
}a[maxn];

int check(long double r)
{	
	int i;	
	double l=-100000000000000000.0;
 	double rig=100000000000000000.0;
	for(i=0;i<n;i++)
	{
		if(a[i].y>r+r)
		{	
			return 0;
		}
		if(r*r-(a[i].y-r)*(a[i].y-r)<0)
		return 1;
	 	double left=a[i].x-sqrt(2*a[i].y*r-a[i].y*a[i].y);
	 	double right=a[i].x+sqrt(2*a[i].y*r-a[i].y*a[i].y);
		l=max(left,l);
		rig=min(right,rig);
	}
	return l<rig;
}
int main(int argc, char *argv[])
{

	while(scanf("%d",&n)!=EOF)
	{
		memset(a,0,sizeof(a));
		int i;
		int z=0;
		int f=0;
		for(i=0;i<n;i++)
		{
			scanf("%lf %lf",&a[i].x,&a[i].y);
			if(a[i].y<0)
			{
				f++;
			}
			else
			{
				z++;
			}
			if(a[i].y<0)
			{
				a[i].y=-a[i].y;
			}
		}	
		if(f>0&&z>0)
		{
			printf("-1\n");
			continue; 
		}	
		double left=0.0;
		double right=100000000000000000.0;
		double mid=(left+right)*1.0/2;
		//printf("%.10Lf\n",right);
		int cnt=0;
		while(cnt<301)
		{
			cnt++;
			//printf("%lf\n",mid);
			if(check(mid))
			{
				right=mid;
			}	
			else
			{
				left=mid;
			}
			mid=(right+left)/2.0;
		} 
		printf("%lf\n",mid);
	}	
	return 0;
}

 

### 如何在 Codeforces 平台上将界面语言设置为中文 Codeforces 是一个国际化的编程竞赛平台,支持多种语言的界面显示,其中包括中文。以下是关于如何将 Codeforces 的界面语言切换到中文的具体方法: #### 1. 登录账户 用户需要先登录自己的 Codeforces 账户。如果尚未注册账户,则需完成注册流程后再进行操作。 #### 2. 进入个人资料页面 点击右上角用户名旁边的下拉菜单选项,在弹出的列表中选择 **Settings**(设置)。此部分允许用户修改各种偏好设定[^1]。 #### 3. 修改语言选项 在 Settings 页面中找到 **Language** 字段,默认可能是 English 或其他语言。通过下拉框可以选择不同的语言选项,其中包含 Simplified Chinese 表示简体中文。选择后保存更改即可生效[^2]。 #### 4. 验证更改效果 返回至首页或其他任意页面确认网站文字已转换成所选目标语言——即中文环境下的表述形式。此时所有的题目描述、公告以及交互提示都将采用中文呈现给用户阅读理解[^3]。 ```python # 示例代码展示如何模拟简单的语言切换逻辑 class UserPreferences: def __init__(self, username): self.username = username self.language = &#39;English&#39; def set_language(self, new_lang): supported_languages = [&#39;English&#39;, &#39;Simplified Chinese&#39;] if new_lang in supported_languages: self.language = new_lang print(f"Language switched to {new_lang} for user {self.username}.") else: print("Unsupported language.") user = UserPreferences(&#39;example_user&#39;) user.set_language(&#39;Simplified Chinese&#39;) # 切换语言为简体中文 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值