题目链接:https://www.nowcoder.com/acm/contest/136/A
题目大意:
圆环形周长L泳池,H与小鲲比赛,小鲲以速度a游一圈,H可以选择以速度b游一圈或者在他与小鲲的距离超过K后,立马掉头回去起点。求的是:小鲲最少比Ht提前多长时间完成比赛,也就是求:[t(H)-t(小鲲)]min。
这是我在牛客网的第一场比赛,前后紧张的3个小时,而我只做出来一道题。在这道题上用的时间最多,然而很惨~到最后也没有通过全部的测试用例。前前后后提交了12次,从测试用例通过24%——48%——80%——90%……o(╥﹏╥)o我考虑的不周到,导致一直在wa……
这个是AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<sstream>
using namespace std;
const int maxn=100000+10;
char b[maxn];
int a[maxn];
typedef long long ll;
int main(){
long double L,K,a,b;
scanf("%Lf %Lf %Lf %Lf",&L,&K,&a,&b);
long double t1=L/a;//小坤用时;
long double t2=L/b;
long double t3;
if(a>b){
t3=K/(a-b);
}
//printf("%Lf\n",t3);
long double t4;
//剩下的距离大于走过的距离,选择返回
if(a<=b||K>=L||t3<(L-K)/2*a)t4=t2;
else
t4=min(t2,2*t3);
//printf("%.2lf\n",t1);
long double dt=t4-t1;
printf("%.2Lf\n",dt);
return 0;
}
题目已经说的很清,就是要求一个最小值。但是这个最小值又要结合互相监督距离K,来考虑(我就是因为没有想到这里一直在wa┭┮﹏┭┮)。
首先小鲲的所用的时间 t1 是恒定不变的。
设 H 不掉头所用 时间 t2。
设 H 与小鲲距离大于等于 K 时间 t3。
设 t4 是H最终所用时间。
以下三点是H不可能掉头的情况:这时 t4 = t2。
- 如果H速度 b 大于等于小鲲 a,H是不可能掉头的。
- 如果互相监督距离 K 大于等于 游泳池周长 L 。
- 在H掉头回到起点的时候,小鲲也与起点接近。这时 他们的距离可能会小于 K。于是有下面方程:
即H 重新回到 起点所用的时间 2*t3 小于了 小鲲 所用(L -K)/a。