codeforces 2C(非原创)

C. Commentator problem
time limit per test
1 second
memory limit per test
64 megabytes
input
standard input
output
standard output

The Olympic Games in Bercouver are in full swing now. Here everyone has their own objectives: sportsmen compete for medals, and sport commentators compete for more convenient positions to give a running commentary. Today the main sport events take place at three round stadiums, and the commentator's objective is to choose the best point of observation, that is to say the point from where all the three stadiums can be observed. As all the sport competitions are of the same importance, the stadiums should be observed at the same angle. If the number of points meeting the conditions is more than one, the point with the maximum angle of observation is prefered.

Would you, please, help the famous Berland commentator G. Berniev to find the best point of observation. It should be noted, that the stadiums do not hide each other, the commentator can easily see one stadium through the other.

Input

The input data consists of three lines, each of them describes the position of one stadium. The lines have the format x,  y,  r, where (x, y) are the coordinates of the stadium's center ( -  103 ≤ x,  y ≤ 103), and r (1 ≤ r  ≤ 103) is its radius. All the numbers in the input data are integer, stadiums do not have common points, and their centers are not on the same line.

Output

Print the coordinates of the required point with five digits after the decimal point. If there is no answer meeting the conditions, the program shouldn't print anything. The output data should be left blank.

Examples
Input
0 0 10
60 0 10
30 30 10
Output
30.00000 0.00000



参考博客:http://blog.csdn.net/snowy_smile/article/details/50131317

这题以我的水平还做不出来,对着几份题解啃,算是大致明白模拟退火的思路,但离真正灵活运用还差很远,有些细节的东西不太明白。
比如近似最优解为什么选重心,为什么要求精度是多少,就要循环多少次,这些我都是看着觉得有道理,但不知道依据是什么。
附ac代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
struct nod {
    double x,y,r;
}c[3];
double ang[3];
const int dy[4]={-1,0,0,1};
const int dx[4]={0,-1,1,0};
double po(double x) {
    return x*x;
}
double dis(double x,double y,double xx,double yy) {  //求距离
    return sqrt(po(x-xx)+po(y-yy));
}
double val(double x,double y) {  //估价函数
    for(int i=0;i<3;++i) ang[i]=dis(x,y,c[i].x,c[i].y)/c[i].r;   //用比较sin值来比较角度
    double v=0;
    for(int i=0;i<3;++i) v+=po(ang[i]-ang[(i+1)%3]);   //用差值的平方和作为估价函数
    return v;                                            //这个值越小,越接近于0,三个圆的视角就越接近
}
int main() {
    double x=0,y=0;
    for(int i=0;i<3;i++) {
        scanf("%lf%lf%lf",&c[i].x,&c[i].y,&c[i].r);
        x+=c[i].x/3;
        y+=c[i].y/3;        //先把重心作为近似最优解
    }
    double err=val(x,y);
    double step=1;
    for(int tim=1;tim<=1e5;++tim) {    //精度为小数点后五位
        bool flag=0;
        double X,Y;
        for(int i=0;i<4;++i) {         //向四个方向推进
            double xx=x+dx[i]*step,yy=y+dy[i]*step;
            double v=val(xx,yy);
            if(v<err) {                 //如果找到,就继续走
                err=v;
                flag=1;
                X=xx;Y=yy;
            }
        }
        if(flag) {
            x=X;
            y=Y;
        }
        else step/=2;  //步长减半
    }
    if(err<1e-6) printf("%.5lf %.5lf\n",x,y);
    return 0;
}
 
    

  


 

转载于:https://www.cnblogs.com/zmin/p/7636353.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值