您的位置:首页 > 编程语言 > Java开发

Java程序练习-放球

2011-10-11 10:46 190 查看
放球

时间限制: 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:

非常感谢 零时の迷子。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: