演算法題練習系列之(三十七): 客似雲來
阿新 • • 發佈:2019-02-10
-----------------------------------------------------------------------------------------------------------
時間限制:1秒 空間限制:32768K 程式碼長度限制 100 KB
題目描述:
NowCoder開了一家早餐店,這家店的客人都有個奇怪的癖好:他們只要來這家店吃過一次早餐,就會每天都過來;並且,所有人在這家店吃了兩天早餐後,接下來每天都會帶一位新朋友一起來品嚐。
於是,這家店的客人從最初一個人發展成浩浩蕩蕩成百上千人:1、1、2、3、5……
現在,NowCoder想請你幫忙統計一下,某一段時間範圍那他總共賣出多少份早餐(假設每位客人只吃一份早餐)。。
輸入描述:
測試資料包括多組。
每組資料包含兩個整數from和to(1≤from≤to≤80),分別代表開店的第from天和第to天。
輸出描述:
對應每一組輸入,輸出從from到to這些天裡(包含from和to兩天),需要做多少份早餐。
輸入例子:
1 10
2 8
36 80
輸出例子:
143
53
61305790697453774
-----------------------------------------------------------------------------------------------------------
實現思路:
(1).典型的斐波那契數列,寫出遞迴求第N項的值;
(2).迴圈從form到to,逐一加和即可;
(3).需要注意的是,該題不能直接遞迴呼叫求結果,會超時,有兩個方法處理,第一種是,先把結果算出來用陣列儲存,然後根據對應的N值,直接獲取對應的兔子數;一種是用map記錄哪些N是計算過的,直接儲存下來,不反覆去計算。-----------------------------------------------------------------------------------------------------------
package com.biyao.algorithm.niuke.a2; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main_a2_004 { public static Map<Integer,Long> map = new HashMap<Integer,Long>(); public static void main(String[] args) { Scanner scan = new Scanner(System.in); while(scan.hasNextInt()){ int from = scan.nextInt(); int to = scan.nextInt(); long count = 0; for (int i = from; i <= to; i++) { count = count + getRabbitNum(i); } System.out.println(count); } } public static long getRabbitNum(int n){ if(n == 1){ return 1; }else if(n == 2){ return 1; }else{ if(map.containsKey(n)){ return map.get(n); }else{ map.put(n, getRabbitNum(n-1) + getRabbitNum(n-2)); } return map.get(n); } } }