欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CF 935 C. Fifa and Fafa 几何(贪心,相似)

程序员文章站 2022-03-30 08:24:34
...
题意:给出圆心(x1,y1)及其半径R的圆A. 和一个非法点(x2,y2)B 
求出一组(x,y,r)使得其覆盖的范围在圆内 要求不能覆盖非法点 并且覆盖的面积为最大. 0<=|x|,|y|<=1e5


新的圆C(x,y,r)肯定和点B已经和圆A相切 否则可以扩大半径 偏移圆心使得 覆盖面积增大.
落在圆A上的切点Q肯定圆上离点B最远点,则BQ经过圆A的半径 同样经过圆C的半径 

画图得r=(R+dis)/2 根据三角形相似算出圆心坐标即可.

#include <bits/stdc++.h>
using namespace std;
typedef long double ld;
const int N=2e5+5;
ld R,x,y,x2,y2;
ld dis(ld x,ld y,ld a,ld b)
{
	return sqrt((x-a)*(x-a)+(y-b)*(y-b));
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>R>>x>>y>>x2>>y2;
	ld d=dis(x,y,x2,y2);
	if(d>=R)
	{
		cout<<fixed<<setprecision(8)<<x<<' '<<y<<' '<<R<<endl;
		return 0;
	}
	ld r=(d+R)*0.5;
	ld a=(x-x2)*(R-r)/d +x;
	ld b=(y-y2)*(R-r)/d +y;
	if(x==x2&&y==y2)
		a=x+r,b=y; 
	cout<<fixed<<setprecision(8)<<a<<' '<<b<<' '<<r<<endl;
	return 0;
}