Java程序练习-放球

放球
时间限制: 10000ms内存限制: 1024kB
描述
有两堆球,一堆有A个球,另一堆则有B个。每一次的操作就是从一堆中拿出一些球放入另一堆,但拿出来的球的个数一定要等于原先“另一堆”中球的数目。问将一堆的球全部放入另一堆至少要多少次:或者根本不可能?
输入
A B
输出
共一行。
若可以移动,则输出移动次数,若不可能,则输出-1。
样例输入
40 24
样例输出
3
提示
其它例子:
16 24
-1
4095 1
12
参考代码

/*
 * Title  :Exchange balls
 * From   :http://nnsznoi.openjudge.cn/lst/5/
 * Time   :2011-10-10 19:20PM
 * Author :Eric Zhou,binfeihan
 * Email  :binfeihan@126.com
 */
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		long a = cin.nextLong();
		long b = cin.nextLong();
		Map<Long,Integer>map = new TreeMap<Long,Integer>();
		long min,max,cnt = 0;
		while(true){
			min = Math.min(a, b);
			max = Math.max(a, b);
			if(map.containsKey(min))
				break;
			else
				map.put(min, 1);
			if(min == 0)
				break;
			a = max - min;
			b = min * 2;
			cnt ++;
		}
		if(min == 0)
			System.out.println(cnt);
		else
			System.out.println(-1);
	}
}
后记
零时の迷子:
我的方法是用数学归纳出来的(a+b)\他们的最大公约数的结果若是2的N次方则移动次数为N
Eric Zhou:
谢谢,过了几天我再来看这个问题时,发现不是设计算法的问题,而是在读入数据时类型错误,正确的读入类型是cin.nextLong()。
long a = cin.nextInt();--X
long b = cin.nextInt();--X
算法的大概思路就是模拟整个交换过程.
Eric Zhou:
非常感谢 零时の迷子。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值