当青训营遇上码上掘金 主题三 寻友之旅
题目:小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
题解:这道题比较简答,只需要使用分类讨论的思想即可解决。
首先要考虑的,是N与K的大小问题。由于公交不可以向后走,因此当N>K时,小青只能采取步行的方式到达K,此时直接返回N-K即可。
其次,当K>N时,通过数学知识与逻辑思考我们可以得到,一分钟内公交移动的距离大于等于步行,因此这部分我们需要乘坐公交在节点X不大于K的前提下逼近K。在代码上,即对N进行循环乘2,同时用一个变量num统计乘2的次数,当2*N>K时跳出循环即可。
此时,还需要讨论一种分类情况
1.直接步行抵达费时最短,即K-N>2*N-K
2.先乘坐一次公交再步行费时最短,即K-N<2*N-K
因此,我们只需要比较K-N与2*N-K的大小,返回较小值与与num的和即可。