codeforces 2C-Commentator problem

题意

给定三个圆坐标以及半径,求一个点坐标,使得点三个圆的视角相等

题解

  1. 数学方法解几何问题:给定三个圆,找一个点,使得这三个圆的视角相等
  2. 玄学之模拟退火(代码部分)

知识点

模拟退火

代码

#include<cstdio>
#include<cmath>
 
int f;
double s,dx,dy,x[3],y[3],r[3],t[3];
double F(double dx, double dy) {
    double ret=0;
    for(int i=0; i<3; i++) 
        t[i]=sqrt((dx-x[i])*(dx-x[i])+(dy-y[i])*(dy-y[i]))/r[i];
    for(int i=0; i<3; i++) 
        ret+=(t[i]-t[(i+1)%3])*(t[i]-t[(i+1)%3]);
    return ret;
}
int main() {
    for(int i=0; i<3; i++)
        scanf("%lf%lf%lf",x+i,y+i,r+i);
    for(int i=0; i<3; i++){
        dx+=x[i]/3;
        dy+=y[i]/3;
    }
    for (s=1; s>1e-6; f=0) {
        if (F(dx,dy)>F(dx+s,dy)) dx+=s, f=1;
        else if (F(dx,dy)>F(dx-s,dy)) dx-=s, f=1;
        else if (F(dx,dy)>F(dx,dy+s)) dy+=s, f=1;
        else if (F(dx,dy)>F(dx,dy-s)) dy-=s, f=1;
        if (!f) s*=0.5;
    }
    if (F(dx,dy)<1e-5) printf("%.5lf %.5lf\n",dx,dy);
    return 0;
}

发布了64 篇原创文章 · 获赞 3 · 访问量 6227

猜你喜欢

转载自blog.csdn.net/qazsatan/article/details/103383059