当青训营遇上码上掘金-寻友之旅

83 阅读1分钟

题意

主题 3:寻友之旅

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)

请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)

作者:青训营官方账号
链接:juejin.cn/post/718775…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思路

一个easy题, 贪心 看了一下别人的题解, 有点暴力, 抽象成有向无环图跑dfs或者是最短路 (恼 其实直接比较一下两种的代价, 那个代价更小 不难发现, 当 N < K 的时候, 我们先*2的结果更优 最后的落点取 min( ct + abs(a - b ) , ct + 1 + abs(2 * a - b ) ) ct 是我们通过公交的时间 当 N >= K , 我们只能步行, 答案返回 a - b 即可

注意 题目的数据 0≤N , K≤100 000 当 n = 0 的时候, 需要特判一下 这个时候就先步行, if(a == 0) a++, ct++;

代码

int main(int argc, char const *argv[])
{
    int a, b;
    cin >> a >> b;
    if(a >= b) {
        cout << abs(a - b) << endl;
    } else {
        int ct = 0;
        if(a == 0) a++, ct++;
        while(2 * a < b) {
            ct++;
            a = a * 2;
        }
        cout << min ( ct + abs (a - b) , ct + 1 + abs(2 * a - b) ) << endl;
    }
    return 0;
}