https://www.luogu.org/problem/CF2C
問題の意味:3は、3つの円の接線角度の上面を与えるために必要と同等の共通円、なし平面部です。答えは条件を満たすようにされていない場合は(、印刷されません。
アイデア:シミュレーテッドアニーリングアルゴリズムは、解答のポイントを列挙するために使用することができ、持っていたことができ、しかし、正の解すべきではありません。まず、最適解と初期の段階を設定し、その溶液は、答えを更新することができない場合は、ステップサイズが半分になり、最適な答えを更新してから、アルゴリズムの精度要件の終わりまで検索するために、現在のステップの検索を続行します。
#include <cstdioを> する#include <cmath> CONST =ダブルEPS-1E 5; //制御精度 のstruct {ポイント ダブルX、Y、 ダブルR&LT; }のP [3]; ダブル取得(ダブルX、Yダブル、ポイントCONST B){// 2点間の距離を見つける ((xb.x)*(xb.x)+(yb.y)*(yb.y))SQRTを返す; } ダブルチェック(ダブルX、Yダブル) {//評価関数 ダブルT [3]、[デルタ 3]、RET = 0.0; // T 現在の視点のためには、デルタエラー値表す ために(INT I = 0;私は<3; ++ I) T [I] =(X、Y、P [I])/ P [I] .R取得し; (; I <3; I = 0をint型Iは++)のために{ デルタ[I] = T [I] -t [(Iは+ +1)%3]; RET =デルタ+ [I] *デルタ[I]; } 戻りRET; //戻り誤差二乗和 } int型のmain(){ BOOLマーク。 ダブルX = 0.0、Y = 0.0。 {(; I <3。++ Iは、I = 0の整数)のための scanfの( "%LFの%のLFの%のLF"、&P [I] .X、&P [I]・Y、&P [I]は.R); X + P = [I] .X / 3; Y = P + [I]・Y / 3; //セット3ラウンド心臓形成される三角形の近似解の重心 } (ダブルT = 1.0、デルタ; T> EPS ;){//初期ステップサイズ1 マーク= 0; //タグ探索 デルタ=チェック(X、Y); IF(チェック(X + T、Y)<デルタ){//よりよいソリューションを検索 X + = T ; マーク= 1; } そうでなければ(チェック(XT、Y)<デルタ){IF X- = T; 。マルコ= 1; } そうIF(チェック(X、Y + T)<デルタ){ Y + = T、 マーク= 。1; } {他(チェック(X、YT)<デルタ)IF T = Y-; マーク= 1; } //検索ステップサイズより小さい場合(マーク!)は、 T / 2 =; } IF(FABS(チェック(X、Y))<EPS)//空 のprintf(「% %.5lf .5lf」、X、Y); 戻り0; }