题目大意
北冥有鱼,其名为鲲,鲲之大,不知其几千里也。
——《庄子·逍遥游》
HtBest有一条可爱的小鲲,HtBest想和与小鲲比赛游泳,我们可以把游泳池看成一个圆环,两人从起点游一圈回到起点即可完成比赛。两人在距离小于k时(距离指的是在环上的距离,而非直线距离),他们会互相监督对方有没有全速向前游,如果发现有一方没有全速向前游,则视为作弊,聪明的HtBest为了省力(更为了赢得比赛),可以选择在两者相距超过k的时候,立马掉头反向游以更快到达起点,HtBest想让你求出小鲲最少比HtBest提前多长时间完成比赛。(若HtBest比小鲲先完成比赛,输出负数)
输入描述:
一行,包含四个正整数,两两之间用空格分开:L(游泳池周长)、k(互相监督距离)、a(小鲲速度)、b(HtBest速度)。所有输入数据均不超过1e9。
输出描述:
一行,包含一个数,表示小鲲最少比HtBest提前多长时间完成比赛。(保留两位小数)。
示例1
输入
4 3 2 1
输出
2.00
示例2
输入
10 2 3 1
输出
-1.33
分析
话说这次t1a的好少,这难度怕不是普及组。
我们进行分类讨论;
当鲲速度慢于人时,我们输出人不作弊的时间减去鲲的时间即可。
当鲲的速度快于人时,我们开始讨论人是否可以作弊
当人有往回走时,我们可知时间与游出时的时间一样,这时考虑最后与鲲的距离,若小于k,则人不能作弊,否则可以,这样就解决了。
上代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
int a,b,l,k;
int main(){
scanf("%d%d%d%d",&l,&k,&a,&b);
if(a<=b){
double t1=(1.0*l)/(1.0*a)*1.0,t2=(1.0*l)/(1.0*b)*1.0;
printf("%.2lf\n",t2-t1);
return 0;
}
double t1=(1.0*k)/(1.0*(a-b))*1.0,x1=1.0*a*t1;
if(1.0*l-2.0*x1<k){
double t3=(1.0*l)/(1.0*a)*1.0,t4=(1.0*l)/(1.0*b)*1.0;
printf("%.2lf\n",t4-t3);
return 0;
}
double t3=(1.0*l)/(1.0*a)*1.0,t4=t1*2.0;
printf("%.2lf\n",t4-t3);
return 0;
}