2044- 一只小蜜蜂(加1加2的问题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2044

最开始想到的做法,每次+1或+2,直到加到目的数为止

import java.util.Scanner;


public class T_2044 {

	static int begin,end;
	static int solutionCount=0;
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int count = input.nextInt();
		for (int i = 0; i < count; i++) {
			solutionCount=0;
			begin = input.nextInt();
			end = input.nextInt();
			deal();
			System.out.println(solutionCount);
		}
		
	}
	
	/**
	 * 每次可以+1  或+2
	 */
	static void deal(){
		if (begin==end) {
			solutionCount++;
		}
		if (begin>=end) {
			return;
		}
		
		begin+=1;
		deal();
		begin-=1;
		
		begin+=2;
		deal();
		begin-=2;
		
	}

}


 

很不幸,ACM没有通过,原因是超时,这也是递归最大的缺陷。

 

本人算法一般,并没有找到另外的递归出口,但是在研究结果的时候发现,根据两个数相差的不同,答案有一定规律。

当两数相差1,2,3,4,5, 6,  7  ...

计算结果为1,1,2,8,5,13,21...

即结果有规律,前两项和是第三项的值,所以本题可以先将50个结果全部求出,再根据输入来选择输出结果即可。

注意:需要使用大数。

 

修改后代码:

import java.math.BigInteger;
import java.util.Scanner;


public class T_2044 {

	static int begin,end;
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {

		//50个结果
		BigInteger[] tmp = new BigInteger[50];
		//初始化第一个和第二个结果
		tmp[1]=BigInteger.ONE;
		tmp[2]=new BigInteger("2");
		//根据规律计算后面的结果
		for (int i = 3; i <tmp.length; i++) {
			tmp[i]=new BigInteger(tmp[i-1].add(tmp[i-2]).toString());
		}
	
		//根据输入    输出结果即可
		Scanner input = new Scanner(System.in);
		int count = input.nextInt();
		for (int i = 0; i < count; i++) {
			begin = input.nextInt();
			end = input.nextInt();
			System.out.println(tmp[end-begin]);
		}
	}
	

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值