• WHYZOJ-#66 穿越七色虹(二分)


    【题目描述】:

    在Nescafe27和28中,讲述了一支探险队前往Nescafe之塔探险的故事……

    当两位探险队员以最快的时间把礼物放到每个木箱里之后,精灵们变身为一缕缕金带似的光,簇簇光芒使探险队员们睁不开眼睛。待一切平静下来之后,探险队员来到了一座宫殿中,玉制的石椅上坐着两个人……

    “你们就是……Nescafe之塔护法中的两位?”

    “是的,我们就是神刀护法xlk和飞箭护法riatre……你们来这里做什么?”

    “我们是前来拜访圣主和四位护法的……”

    “如果你们想见圣主和其它两位护法,你们必须穿过前方的七色彩虹。请随我来吧……”

    探险队员们跟随两位护法来到了七色虹前。七色虹,就是平面直角坐标系中赤橙黄绿青蓝紫七个半圆,第i座(1<=i<=7)半圆形彩虹的圆心是(xi,0),半径是ri,半圆上所有点的纵坐标均为非负数。探险队员可以看做一条竖直的、长度等于身高的线段,线段的底端纵坐标为0,最高的一位探险队员的身高为h。

    现在探险队员们要从(0,0)到达(x0,0),穿越彩虹的过程中,探险队员的整个身体必须始终在至少一个半圆形彩虹的内部。由于彩虹的半径ri可能太小了,不足以满足这个条件,因此两位护法决定帮助他们把所有彩虹的半径都增大一个非负实数r。探险队员们想知道,r最小是多少呢?

    【输入描述】:

    第一行两个实数h、x0,表示身高和目的地横坐标。

    接下来七行每行两个实数xi、ri,表示七座半圆形彩虹的圆心和半径。

    【输出描述】:

    输出最小的r,四舍五入保留2位小数。

    【样例输入】:

    4.0 36.0 
    0.0 4.0 
    6.0 4.0 
    12.0 4.0 
    18.0 4.0 
    24.0 4.0 
    30.0 4.0 
    36.0 4.0

    【样例输出】:

    1.00

    【时间限制、数据范围及描述】:

    时间:1s 空间:64M

    对于 100% 的数据,满足0<=xi,x0<=10000,0<h<100。

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <queue>
     6 #include <stack>
     7 #include <vector>
     8 #include <iostream>
     9 #include "algorithm"
    10 using namespace std;
    11 typedef long long LL;
    12 const int MAX=10;
    13 int a[MAX];
    14 struct Node{
    15     double x,y;
    16     bool operator <(const Node &tt) const {
    17         return x<tt.x;
    18     }
    19 }sst[MAX];
    20 double h,xx;
    21 bool feasible(double x){
    22     int i,j;double r[MAX];
    23     for (i=1;i<=7;i++){
    24         double zt=(sst[i].y+x)*(sst[i].y+x)-h*h;
    25         if (zt<0)
    26             r[i]=0;
    27         else
    28             r[i]=sqrt(zt);
    29     }
    30     Node cc[MAX];
    31     for (i=1;i<=7;i++){
    32         cc[i].x=sst[i].x-r[i];
    33         cc[i].y=sst[i].x+r[i];
    34     }
    35     sort(cc+1,cc+8);
    36     double now=0.0;
    37     for (i=1;i<=7;i++){
    38         if (now>xx) return true;
    39         if (now<cc[i].x)
    40             return false;
    41         now=max(now,cc[i].y);
    42     }
    43     if (now<xx) return false;
    44     return true;
    45 }
    46 int main(){
    47     freopen ("rainbow.in","r",stdin);
    48     freopen ("rainbow.out","w",stdout);
    49     int i,j;
    50     scanf("%lf%lf",&h,&xx);
    51     for (i=1;i<=7;i++)
    52         scanf("%lf%lf",&sst[i].x,&sst[i].y);
    53     double low,high,mid;
    54     low=0,high=xx;
    55     while (high-low>0.0000001){
    56         mid=(low+high)/2.0;
    57         if (feasible(mid))
    58             high=mid;
    59         else
    60             low=mid;
    61     }
    62     printf("%.2lf",low);
    63     return 0;
    64 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    oracle11g windows客户端安装
    leetcode做题总结
    后端工程师都应该知道的最佳实践
    阿里云ubuntu下nginx部署上线后报错问题
    漫谈逆向工程
    RPC远程过程调用(Remote Procedure Call)
    stub和proxy使用初衷
    vue如何绑定多个class style
    简单又好看的背景 , 代码实现方格背景
    使用C#.NET调用ICU进行编码检测和编码转换
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/7345839.html
Copyright © 2020-2023  润新知