贪心-牛客寒假集训营5-D-牛牛与牛妹的约会
题目:
题意:
在 数 轴 上 给 定 两 个 位 置 坐 标 a , b , 从 a 走 到 b 有 两 种 走 法 , 在数轴上给定两个位置坐标a,b,从a走到b有两种走法, 在数轴上给定两个位置坐标a,b,从a走到b有两种走法,
① 、 从 a − > a 3 , 代 价 为 1 个 单 位 时 间 。 ①、从a->\sqrt[3]{a},代价为1个单位时间。 ①、从a−>3a,代价为1个单位时间。
② 、 以 1 单 位 距 离 / 1 单 位 时 间 的 速 度 步 行 。 ②、以1单位距离/1单位时间的速度步行。 ②、以1单位距离/1单位时间的速度步行。
问 从 a 到 b 的 最 小 代 价 时 间 是 多 少 。 问从a到b的最小代价时间是多少。 问从a到b的最小代价时间是多少。
题解:
贪 心 , 比 较 每 一 步 的 代 价 , 选 择 代 价 较 小 的 方 案 。 贪心,比较每一步的代价,选择代价较小的方案。 贪心,比较每一步的代价,选择代价较小的方案。
因 为 a − > a 3 的 代 价 是 1 , 在 1 个 单 位 时 间 里 方 案 ② 可 以 靠 近 1 个 单 位 距 离 , 所 以 对 比 单 位 时 间 里 , 哪 种 方 案 使 得 距 离 差 ( 坐 标 的 绝 对 值 差 ) 更 小 , 即 ∣ a 3 − b ∣ 与 ∣ a − b ∣ − 1 的 大 小 因为a->\sqrt[3]{a}的代价是1,在1个单位时间里方案②可以靠近1个单位距离,\\所以对比单位时间里,哪种方案使得距离差(坐标的绝对值差)更小,即|\sqrt[3]{a}-b|与|a-b|-1的大小 因为a−>3a的代价是1,在1个单位时间里方案②可以靠近1个单位距离,所以对比单位时间里,哪种方案使得距离差(坐标的绝对值差)更小,即∣3a−b∣与∣a−b∣−1的大小
注 意 : ① 、 对 a 开 立 方 根 : a > 0 : p o w ( a , 1.0 / 3 ) ; a < 0 : − p o w ( − a , 1.0 / 3 ) 注意:①、对a开立方根:a>0:pow(a,1.0/3);\ \ \ \ \ a<0:-pow(-a,1.0/3) 注意:①、对a开立方根:a>0:pow(a,1.0/3); a<0:−pow(−a,1.0/3)
② 、 显 然 开 立 方 根 的 方 案 效 率 是 递 减 的 , 因 此 先 处 理 连 续 开 立 方 根 的 操 作 , 最 后 直 接 加 上 距 离 差 。 \ \ \ \ \ \ \ \ \ \ \ \ ②、显然开立方根的方案效率是递减的,因此先处理连续开立方根的操作,最后直接加上距离差。 ②、显然开立方根的方案效率是递减的,因此先处理连续开立方根的操作,最后直接加上距离差。
代码:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x7fffffff
using namespace std;
int T;
double a,b;
double ans;
int main()
{
cin>>T;
while(T--)
{
ans=0;
scanf("%lf%lf",&a,&b);
double ka,da;
if(a<0)
{
if(abs(-pow(-a,1.0/3.0)-b)<abs(a-b)-1)
while(abs(-pow(-a,1.0/3.0)-b)<abs(a-b)-1)
{
ans+=1;
a=-pow(-a,1.0/3.0);
}
}
else
{
if(abs(pow(a,1.0/3.0)-b)<abs(a-b)-1)
while(abs(pow(a,1.0/3.0)-b)<abs(a-b)-1)
{
ans+=1;
a=pow(a,1.0/3.0);
}
}
ans+=abs(a-b);
printf("%.9f\n",ans);
}
return 0;
}