C. Discrete Acceleration(浮点数二分)

原题链接

There is a road with length ll meters. The start of the road has coordinate 00, the end of the road has coordinate ll.

There are two cars, the first standing at the start of the road and the second standing at the end of the road. They will start driving simultaneously. The first car will drive from the start to the end and the second car will drive from the end to the start.

Initially, they will drive with a speed of 11 meter per second. There are nn flags at different coordinates a1,a2,…,ana1,a2,…,an. Each time when any of two cars drives through a flag, the speed of that car increases by 11 meter per second.

Find how long will it take for cars to meet (to reach the same coordinate).

Input

The first line contains one integer tt (1≤t≤1041≤t≤104): the number of test cases.

The first line of each test case contains two integers nn, ll (1≤n≤1051≤n≤105, 1≤l≤1091≤l≤109): the number of flags and the length of the road.

The second line contains nn integers a1,a2,…,ana1,a2,…,an in the increasing order (1≤a1<a2<…<an<l1≤a1<a2<…<an<l).

It is guaranteed that the sum of nn among all test cases does not exceed 105105.

Output

For each test case print a single real number: the time required for cars to meet.

Your answer will be considered correct, if its absolute or relative error does not exceed 10−610−6. More formally, if your answer is aa and jury's answer is bb, your answer will be considered correct if |a−b|max(1,b)≤10−6|a−b|max(1,b)≤10−6.

Example

input

Copy

5
2 10
1 9
1 10
1
5 7
1 2 3 4 6
2 1000000000
413470354 982876160
9 478
1 10 25 33 239 445 453 468 477

output

Copy

3.000000000000000
3.666666666666667
2.047619047619048
329737645.750000000000000
53.700000000000000

Note

In the first test case cars will meet in the coordinate 55.

The first car will be in the coordinate 11 in 11 second and after that its speed will increase by 11 and will be equal to 22 meters per second. After 22 more seconds it will be in the coordinate 55. So, it will be in the coordinate 55 in 33 seconds.

The second car will be in the coordinate 99 in 11 second and after that its speed will increase by 11 and will be equal to 22 meters per second. After 22 more seconds it will be in the coordinate 55. So, it will be in the coordinate 55 in 33 seconds.

In the second test case after 11 second the first car will be in the coordinate 11 and will have the speed equal to 22 meters per second, the second car will be in the coordinate 99 and will have the speed equal to 11 meter per second. So, they will meet after 9−12+1=839−12+1=83 seconds. So, the answer is equal to 1+83=1131+83=113.

思路:

1,浮点数的二分写法不一样,

2,对路程时间的理解不同

代码:

#include<bits/stdc++.h>
using namespace std;
#define vec vector<int>
const int maxj=1e5+100,mod=1e9+7,inf=0x3f3f3f3f;

int a[maxj];
int n,l;
bool check(double t){//模拟车走的过程
    a[0]=0;a[n+1]=l;
    double id=0,s1=1,t1=t;
    for(int i=1;i<=n;++i){
        if(id>l)return 1;
        double tt=(a[i]-a[i-1])/s1*1.0;
        if(t1>=tt){
            t1-=tt;
            s1++;
            id+=(a[i]-a[i-1]);
        }else break;
    }
    id+=t1*s1;
    double id2=l,s2=1,t2=t;
    for(int i=n;i>=1;--i){
        if(id2<0)return 1;//时间可行
        double tt=(a[i+1]-a[i])/s2*1.0;
        if(t2>=tt){
            id2-=(a[i+1]-a[i])*1.0;//
            t2-=tt;
            s2++;
        }else break;//id2我减的是a[i+1]-a[i],所以要及时break;
    }
    id2-=t2*s2;
    return id>=id2;
}
void solve(){
    //对时间路程速度的理解,以及对浮点数二分的把握
    //对时间二分,因为每过一次a[i]速度加1,所以a[i]的间隔是路程,然后速度加1
    cin>>n>>l;
    for(int i=1;i<=n;++i){
        cin>>a[i];
    }
    double ll=0,rr=l; 
    while(rr-ll>1e-6){
        double mid=(ll+rr)/2.0;
        if(check(mid))rr=mid;//浮点数的二分
        else ll=mid;
    }
    cout<<fixed<<setprecision(15)<<rr<<'\n';
}
signed main(){

    int t;
    t=1;
    cin>>t;
    while(t--)solve();
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值