算法练习题之抓住那头牛

在搜索Trie树内容的时候,在一个OJ答题网站“百练”看到一道题感觉还蛮有意思的,所以就自己写了一下,用java写的,下面贴出来:

描述

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:

1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟

假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?


输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
5 17
样例输出
4
注意:这里发现一个问题,就是它的输出没有以农夫与牛坐标重合为标记,感觉有点不符合常规,因此我觉得它的输出应该是5.后面我的代码也是以重合为标记的,所以请注意此提示。

上代码:

package p1;

import java.util.Scanner;

public class AcmTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		System.out.println("输入");
		Scanner in = new Scanner(System.in);
		int farmer = in.nextInt();
		int cow = in.nextInt();
		if(farmer<0 || farmer>100000 || cow<0 || cow>100000){
			System.out.println("输入无效!");
		}else{
			System.out.println(getMinTime(farmer,cow));
		}
	}
	
	//计算最少时间
	public static int getMinTime(int f, int c)
	{
		//如果牛的坐标小于农夫,则可以做交换便于处理,结果一致
		if(f > c){
			int temp;
			temp = c;
			c = f;
			f = temp;
		}
		int time = 0;
		int f1 = 0,f2 = 0;	//f1是指先以X+1,X-1运动方式进行,f2是指先以X->2X运动方式进行
		int long1,long2;	//long1是指运动超过牛之后坐标差,long2是指运动后没有超过牛的坐标差
		while(4*f < c){
			if(2*f >c)
				break;
			f = 2*f;	//执行x到2x的运动方式
			time++;
		}
		if((f1 = 2*f) >c && isBeyond(f1)){
			long1 = f1 - c;	//超过之后的距离
			long2 = long1/2;	//可以进行2x运动的调整次数
			if((f2 = 2*(f-long2)) <= c){
				time = time+long2 + 1;	//运动时间
			}
		}else{
			f1 = 2*f;
			long1 = c - f1;
			long2 = long1/2;
			f2 = 2*(f+long2);
			time = time+long2+1;
		}
		//以农夫跟牛的坐标重合为成功
		if(c % 2 != 0)
			time++;
		return time;
	}
	//判断农夫是否出界
	public static boolean isBeyond(int f){
		if(f<0 || f>100000){
			return false;
		}else{
			return true;
		}
	}
}


你可能感兴趣的:(java技术,数据结构算法,算法,抓住那头牛,Acm,Oj,java)