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

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

比赛的时候很遗憾……差一点就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 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值