【NOIP2013模拟】穿越七色虹

利用勾股定理判断,二分查找,就可AC
二分答案,判断答案是否符合条件: 
利用勾股定理判断线段是否覆盖(0,0)到(x0,0),注意精度,有可能有点超过x0的情况 
var a,b:array[0..7,1..2]of real;
    i,j,tot:longint;
    h,x0,l,r,m,ans:real;
function f(a,b:real):real;
begin
    exit(sqrt(a*a-b*b));
end;
function pan:boolean;
    var i,j,l:longint;
        bool:boolean;
begin
    if tot=0 then exit(false);
    if b[1,1]>0 then exit(false);
    bool:=true;
    for i:=tot downto 1 do
        if b[i,2]>=x0 then
        begin
            bool:=false;
            break;
        end;
    if bool then exit(false);
    l:=1;
    for i:=1 to tot do
    begin
        if i>l then exit(false);
        for j:=i+1 to tot do
            if b[i,2]>=b[j,1] then
            begin
                if j>l then l:=j;
                if l=tot then exit(true);
            end;
    end;
    exit(true);
end;
begin
    read(h,x0);
    l:=0; r:=x0; ans:=x0;
    for i:=1 to 7 do read(a[i,1],a[i,2]);
    while l<r do
    begin
        m:=trunc((l+r)*5000)/10000;
        tot:=0;
        for i:=1 to 7 do
            if a[i,2]+m>=h then
            begin
                inc(tot);
                b[tot,1]:=a[i,1]-f(a[i,2]+m,h);
                b[tot,2]:=a[i,1]+f(a[i,2]+m,h);
            end;
        for i:=1 to tot-1 do
            for j:=i+1 to tot do
                if b[i,1]>b[j,1] then
                begin
                    b[0]:=b[i];
                    b[i]:=b[j];
                    b[j]:=b[0];
                end;
        for i:=1 to tot do
            if b[i,1]>x0 then break;
        tot:=i-1; 
        if pan then
        begin
            r:=m-0.001;
            ans:=m;
        end else
            l:=m+0.001;
    end;
    writeln(ans:0:2);
end.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值