2020牛客寒假算法基础集训营5 D. 牛牛与牛妹的约会

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

题目描述

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

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

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

 思路

 简单贪心,对比闪现和普通移动的速度即可。有一个点卡的有点难受,立方根如果用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
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;
}

 

你可能感兴趣的:(#,#,贪心,#,错题集)