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的半径
求出一组(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;
}
上一篇: Python基础 第五章