您的位置:首页 > 其它

Codeforces Round #465 (Div. 2) C. Fifa and Fafa (SB题)

2018-02-21 13:47 525 查看
题意是这样的:在大圆里找一个小圆,这个圆要求在不包括一个点的前提下,尽可能的大,输出圆心坐标和半径

比赛的时候很遗憾……差一点就A了,我们先来判断我们不包括的点的情况,如果这个点在圆的外面,那问题就很简单了,只要输出大圆就行

如果这个点在大圆内,那我们先考虑一般情况:



p点是我们不想包括的点,这个圆就是以p点到大圆圆心的延长线与大圆的交点为直径的圆,直径是p点和圆形的距离加上半径,小圆的圆心可以用相似三角形做出

假设p点正好在大圆圆心上,那么只要输出任意一个以半径为直径的圆就行。比赛的时候失了智,卡在了这……

#include <bits/stdc++.h>
#include <cstring>
#define ll long long
#define fi first
#define se second
#define INF 0x3f3f3f3f;
using namespace std;
int main()
{
double R,x,x2,y,y2;
cin>>R>>x>>y>>x2>>y2;
if((x - x2 )*(x- x2) + (y - y2)*(y - y2) >= R * R)
{
cout<<setprecision(16)<<fixed<<x<<" "<<y<<" "<<R<<endl;
}
else
{

double dist = sqrt((x - x2 )*(x- x2)+(y - y2)*(y - y2));
double nr = dist+R;
nr /= 2.0;
if(x == x2 && y == y2)
{
return cout<<x<<" "<<y+0.5*R<<" "<<0.5*R,0;
}
double nx = x;
double ny = y;
nx = x2 + (x - x2)*nr/dist;
ny = y2 + (y - y2)*nr/dist;
cout<<setprecision(16)<<fixed<<nx<<" "<<ny<<" "<<nr<<endl;
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: