CSP模测4 T2 ZJM要抵御宇宙射线

ZJM要抵御宇宙射线

据传,2020年是宇宙射线集中爆发的一年,这和神秘的宇宙狗脱不了干系!但是瑞神和东东忙 于正面对决宇宙狗,宇宙射线的抵御工作就落到了ZJM的身上。假设宇宙射线的发射点位于一个 平面,ZJM已经通过特殊手段获取了所有宇宙射线的发射点,他们的坐标都是整数。而ZJM要构 造一个保护罩,这个保护罩是一个圆形,中心位于一个宇宙射线的发射点上。同时,因为大部分 经费都拨给了瑞神,所以ZJM要节省经费,做一个最小面积的保护罩。当ZJM决定好之后,东东 来找ZJM一起对抗宇宙狗去了,所以ZJM把问题扔给了你~
输入描述

输入 第一行一个正整数N,表示宇宙射线发射点的个数 接下来N行,每行两个整数X,Y,表示宇宙射线发射点的位置

输出描述

输出包括两行 第一行输出保护罩的中心坐标x,y 用空格隔开 第二行输出保护罩半径的平方
(所有输出保留两位小数,如有多解,输出x较小的点,如扔有多解,输入y较小的点) 无行末空格

样例输入

5 
0 0
0 1 
1 0 
0 -1 
-1 0

样例输出

0.00 0.00 1.00

数据组成

数据点nxy
1~5n<=100x<=10000y<=10000
6~10n<=1000x<=100000y<=100000

问题分析

遍历所有坐标,对每一个坐标i,计算它到其他坐标的距离,取最大值为以i为圆心的圆的半径r。如果半径r小于R(最终答案,初始值为最大值),说明这个圆符合要求,更新圆心的坐标为i,半径R=r。如果半径r等于R,说明有多解,按照题目要求,如有多解,输出x较小的点,如扔有多解,输入y较小的点
最后输出结果,注意输出半径的平方,且保留两位小数printf("%.2f",r*r),

代码实现

#include<stdio.h>
#include<algorithm>
#include<math.h> 
using namespace std;
const double eps = 1e-8;
struct point
{
	double x,y;
	void operator = (const point t)
	{
		x=t.x;
		y=t.y;
	}
};

bool cmp(const point a,const point b)
{
	if(a.x!=b.x)return a.x<b.x;
	return a.y<b.y;
}

double dis(point a, point b)
{
	double x=a.x-b.x;
	double y=a.y-b.y;
	return sqrt(x*x+y*y);
}

point a[1005],C;
double R;

int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0; i<n; i++)
	{
		scanf("%lf%lf",&a[i].x,&a[i].y);
	}
	C = a[0];
	R = 1e12;
	for(int i=0; i<n; i++)
	{
		point t = a[i];
		double r=-1;
		for(int j=0; j<n; j++)
		{
			double dist = dis(a[j], t);
			if(dist >= r)
			    r = dist;
		}
		if(R==r&&t.x<=C.x)
		{
			R=r;
			if(t.x<C.x)
			    C=t;
			else if(t.x==C.x)
			{
				if(t.y<C.y)
				    C=t;
			}
		}
		else if(R>r)
		{
			R=r;
			C=t;
		}
	}
	printf("%.2lf %.2lf\n", C.x, C.y);
	printf("%.2lf\n", R*R);
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值