当青训营遇上码上掘金

93 阅读2分钟

当青训营遇上码上掘金

题目

主题 3:寻友之旅

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。

步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1

公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)

思路

小青和小码的位置一共有三种情况:

1.小青在的地点N<小码在的地点K。

此时若K-N<1,使用步行,1分钟就能遇见小码。

若K-N>1,当K-N为偶数时,小青直接乘坐公交到小码的位置。

若K-N>1,当K-N为奇数时,小青先走1步,再乘坐公交到小码的位置。

2.小青在的地点N<小码在的地点K。

此时小青不需要移动,直接就可以遇见小码,输出时间0分钟。

3.小青在的地点N>小码在的地点K。

因为公交只能往前走,所以此时小青不能乘坐公交,只能选择步行。因此由N-K即可求得相遇的时间。

代码

#include <iostream>
#include<cmath>
using namespace std;
int main(){
  double n,k;
  int count;
  cout<<"请依次输入n和k:" ;
  cin>>n;
  cin>>k;
 // fmod(k-n,2)
  if(n==k){
    count=0;
  } 
  if(n<k){
    if(fmod(k-n,2)==0)
      count=(k-n)/2;
    if(fmod(k-n,2)==1){
        if((k-n)==1)
          count=1;
        else count=1+(k-n-1)/2;
      }
  }
  if(n>k){
    count=n-k;
  }
  cout<<"一共需要"<<count<<"分钟";
  return 0;
}

总结

这道题的思路相对好想,但也有一些需要注意。

比如N和K,不能够用int来定义,否则无法满足N和K最大是100 000的条件。我选择用double类型定义,保证了值能取到,但在if判断条件的时候就需要用fomd函数判断K-N的奇偶,不能直接通过简单的除二取余判断。

此方法判断的语句比较多,没有循环,时间复杂度为o(1)。