1. 程式人生 > >Codeforces Round #465 &935C. Fifa and Fafa計算幾何

Codeforces Round #465 &935C. Fifa and Fafa計算幾何

stream codeforce false pre hide -- abs style ios

傳送門

題意:在平面中,有一個圓,有一個點,問能在這個圓中圍出最大的圓的圓心坐標和半徑。要求這個最大圓不包含這個點。

思路:比較基礎的計算幾何,要分三種情況,第一種就是這個點在圓外的情況。第二種是點在圓內。第三種是這個點和圓心重合。

ac代碼

技術分享圖片
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include 
<set> #include <queue> #include <list> #include <iterator> #include <cmath> using namespace std; #define lson (l , mid , rt << 1) #define rson (mid + 1 , r , rt << 1 | 1) #define debug(x) cerr << #x << " = " << x << "\n"; #define
pb push_back #define pq priority_queue #define Pll pair<ll,ll> #define Pii pair<int,int> #define fi first #define se second #define OKC ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) typedef long long ll; typedef unsigned long long ull; const double espp = 0.0000000001; /*-----------------show time----------------
*/ double R,x,y,x2,y2; double dis(double a,double b,double x,double y) { return sqrt((a-x)*(a-x) + (b-y)*(b-y)); } int main(){ scanf("%lf%lf%lf%lf%lf", &R, &x, &y, &x2, &y2); double d = dis(x,y,x2,y2); if(d > R ||abs(d-R) < espp) { printf("%lf %lf %lf\n",x,y,R); } else { double r1 = (R + d)/2; double dx = 1.0*(x-x2)*(x-x2) + 1.0*(y-y2)*(y-y2); dx = sqrt(dx); double ans1,ans2; if(dx!=0) { ans1 = x2 + (x-x2)/dx*r1; ans2 = y2 + (y-y2)/dx*r1; } else { ans1 = x; ans2 = y+R/2; } printf("%.9lf %.9lf %.9lf\n",ans1,ans2,r1); } return 0; }
CF935C

Codeforces Round #465 &935C. Fifa and Fafa計算幾何