zoukankan      html  css  js  c++  java
  • 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
    ",x,y);
        return 0;
    }
    
    
    

      


     
  • 相关阅读:
    算法 在一个递增的二维数组中查找一个数
    java web----网络编程基础
    java----集合(Map)
    java----集合(List、set)
    java----数组
    java面试----1
    java----NIO
    java----commons-io
    java----文件操作
    爬虫----爬取答案
  • 原文地址:https://www.cnblogs.com/zmin/p/7636353.html
Copyright © 2011-2022 走看看