[2016-03-05][UVALive][4504][Trick or Treat]

[2016-03-05][UVALive][4504][Trick or Treat]
  • 时间:2016-03-05 12:06:59 星期六
  • 题目编号: UVALive 4504 B - Trick or Treat
  • 题目大意:给定坐标轴上若干个点,每个点上有一个人,求x轴上一点,使得所有人到这个点集合所花费的时间最短,所有人同时出发,
  • 输入:
      • 若干组数据,0结束
        •         每组数据
        •         n顶点个数
        •         接下来n行,每个顶点的坐标 double 类型
  • 输出:点的坐标,需要的时间
  • 分析:可以看出,x轴上从左到最优点,到右, 花费的时间 先降低后升高,那么就可以3分坐标点,求出最优的答案
  • 使用min,max会WA,
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long LL;
#define CLR(x,y) memset((x),(y),sizeof((x)))
const int maxn = 50000 + 100;
int n;
struct Point{
        double x,y;
}p[maxn];
double Calc(double x) {
        double rtn = 0;
        for(int i = 0 ; i < n ;++i){              
                double d = p[i].y * p[i].y + (p[i].x - x) * (p[i].x - x);
                if(d > rtn)     rtn = d;
        }
        return rtn;
}
const double eps = 1e-8;
double Solve(double MINdouble MAX) {
        double l = MIN, r = MAX,mid,mid2,d1,d2;   
        while(r - l > 1e-8){
                mid = (l + r) / 2;
                mid2 = (mid + r) / 2;
                d1 = Calc(mid);
                d2 = Calc(mid2);
                if (d2 > d1) r = mid2;
                else l = mid;
        }
        return l;
}
int main(){
        while(~scanf("%d",&n) && n){
                double l = 200000,r = -200000;
                for(int i = 0;i < n ;++i){
                        scanf("%lf%lf",&p[i].x,&p[i].y);
                        if(l > p[i].x)  l = p[i].x;
                        if(r < p[i].x)  r = p[i].x;
                }
                double res = Solve(l,r);
                printf("%.9lf %.9lf\n",res,sqrt(Calc(res)));
        }
    return 0;
}  




来自为知笔记(Wiz)


posted on 2016-03-05 21:31  红洋  阅读(185)  评论(0)    收藏  举报

导航