题意
主题 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;
}