思路分析:第一种实现——直接计算不同前进策略的结果,输出最优解。
第二种实现——判断最后一步是跳过终点再选择往回走还是在终点前停止跳跃,改为走向终点的判断依据为:取余判断余数与N的一半之间的大小,小即为最优解。
注:题目中题意对“跳”概念的准确理解是解题关键;“在单位时间内从任意一点 x 跳到 2*x”这句话怎么理解呢?跳的步幅是动态变化的还是静态的,主要还需从题目用例中辨别。经分析题目用例,此处跳的步幅应该是静态的。这也是这道题的失败之处,题目存在歧义容易。也许是出题者故意而为之吧。
代码实现:
import java.util.Scanner; public class StupidHorse { public static void main(String[] args) { //测试 Scanner x=new Scanner(System.in); System.out.println("请输入一个小花的起始位置n以及萝卜位置k;(0=<n<=100000;0=<k<=100000):"); int n=x.nextInt(); int k=x.nextInt(); System.out.println("起始位置为"+n); System.out.println("萝卜位置为"+k); minTime(n,k); minTime2(n, k); } //策略一: public static void minTime(int n,int k){ if(n==0||n==1){ //起点为0或1,一直走到黑 System.out.println(k-n); }else{ //定义s路程。最短时间必然是“先跳后走”。 int s = Math.abs(k-n); //两种case:跳过终点,再往回走到终点;跳至终点前,然后走向终点。 int x = s/n + s%n; int y = s/n+1 + (s/n+1)*n-s; //判断两种场景的最优解,输出。 if(x>=y){ System.out.println(y); }else{ System.out.println(x); } } } //策略二: public static void minTime2(int n,int k){ if(n==0||n==1){ //起点为0或1,一直走到黑 System.out.println(k-n); }else{ //定义s路程。最短时间必然是“先跳后走”。 int s = Math.abs(k-n); //两种case:跳过终点,再往回走到终点;跳至终点前,然后走向终点。最优解判断依据取余和n的一半做比较。 int x=0; if(s%n<=n/2){ x = s/n + s%n; }else{ x = s/n+1 + (s/n+1)*n-s; } //判断两种场景的最优解,输出。 System.out.println(x); } } }