链接:https://ac.nowcoder.com/acm/contest/3006/D

牛牛在辛苦的一天的比赛之后,要去找牛妹玩,其实牛妹那天也在比赛。他为了找到牛妹,要尽快的从自己的比赛地到她的比赛地。

还记得吗,比赛地都是只在xx轴上的,所以两个人的坐标都满足y=0y=0。牛牛除了可以以11单位距离/单位时间的速度移动任意时间以外,还可以花费11单位时间进行闪现。每次闪现时,如果当前他的坐标是x=kx=k,他将闪现到x=\sqrt[3]{k}x=3k​的位置。

请帮他算算,最短需要多少时间,他可以找到牛妹~

输入描述:

 

输入数据包括多组用例,输入第一行包含一个数字T(1 \leq T \leq 5 \times 10^5)T(1≤T≤5×105),表示数据组数。

接下来TT行,每行包括两个整数a,b(|a|,|b|\leq 10^6)a,b(∣a∣,∣b∣≤106),表示牛牛所在的位置和牛妹所在的位置。

输出描述:

 

输出共TT行,每行包括一个实数,表示牛牛所花费的最短时间。

如果你的答案是aa,标准答案是bb,当|a-b|\leq 10^{-6}∣a−b∣≤10−6时,你的答案将被判定为正确。

示例1

输入

复制

2
3 -1
1 2

输出

复制

3.442249570
1.000000000

没想到被pow坑了,隐约记得曾经也被坑过,下次一定不能再掉进坑里了

代码:

#include<bits/stdc++.h>
using namespace std;
long long t,n,m,r;
double a;
long long b;
double s,k;
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>a>>b;
		//cout<<pow(-1,1.0/3);
		s=0;
		if(a<0)
		{
			a=-a;
			b=-b;
		}
		while(fabs(a-1.0*b)>fabs(pow(a,1.0/3)-1.0*b)+1)
		{
			a=pow(a,1.0/3);
			//cout<<-1<<endl;
			s+=1;
		}
		//k=pow(a,1.0/3);
		s+=fabs(a-b);
		printf("%.9lf\n",s);
	}
}