https://ac.nowcoder.com/acm/contest/3006/D
题目描述
牛牛在辛苦的一天的比赛之后,要去找牛妹玩,其实牛妹那天也在比赛。他为了找到牛妹,要尽快的从自己的比赛地到她的比赛地。
还记得吗,比赛地都是只在x轴上的,所以两个人的坐标都满足。牛牛除了可以以1单位距离/单位时间的速度移动任意时间以外,还可以花费1单位时间进行闪现。每次闪现时,如果当前他的坐标是,他将闪现到的位置。
请帮他算算,最短需要多少时间,他可以找到牛妹~
思路
简单贪心,对比闪现和普通移动的速度即可。有一个点卡的有点难受,立方根如果用pow函数计算的话,不能是负数的立方根(?????),否则就是nan,我因为这个wa好几次,太难了。直接调用库函数cbrt(求立方根的库函数)
求速度好算,首先计算出来闪现下一步抵达的位置nexpostion,用当前位置和牛妹的坐标计算一个距离,再用闪现后的坐标计算几个距离,如果如果前者减去后者大于1.0,说明闪现快,继续闪现,否则说明闪现慢了。不用考虑两个人正负相同的情况,因为那样的话闪现就会把距离拉长,计算的数字是一个负数,所以也满足上述要求。
/*************************************************************************
> File Name: D.cpp
> Author: amoscykl
> Mail: [email protected]
> Created Time: 2020年02月14日 星期五 14时19分56秒
************************************************************************/
#include<bits/stdc++.h>
using namespace std;
double sqrt3(double x){
return cbrt(x);
}
int main(){
int T;
scanf("%d", &T);
while (T--){
int a, b;
scanf("%d %d", &a, &b);
double x = a;
double y = b;
double res = 0.0;
while (1){
double nex = sqrt3(x);
double lastdist = abs(x - y);
double nowdist = abs(nex - y);
if (lastdist - nowdist > 1.0){
x = nex;
res += 1.0;
}
else{
res += lastdist;
break;
}
}
printf("%.8lf\n", res);
}
return 0;
}