Description
1)一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱L,石柱L面积只容得下一只青蛙落脚,同样右岸也有一石柱R,石柱R面积也只容得下一只青蛙落脚。 2)有一队青蛙从小到大编号:1,2,…,n。 3)初始时:青蛙只能趴在左岸的石头 L 上,按编号一个落一个,小的落在大的上面-----不允许大的在小的上面。 4)在小溪中有S个石柱、有y片荷叶。 5)规定:溪中的每个石柱上如果有多只青蛙也是大在下、小在上,每个荷叶只允许一只青蛙落脚。 6)对于右岸的石柱R,与左岸的石柱L一样允许多个青蛙落脚,但须一个落一个,小的在上,大的在下。 7)当青蛙从左岸的L上跳走后就不允许再跳回来;同样,从左岸L上跳至右岸R,或从溪中荷叶、溪中石柱跳至右岸R上的青蛙也不允许再离开。 问题:在已知小溪中有 s 根石柱和 y 片荷叶的情况下,最多能跳过多少只青蛙?
Input
输入数据有多组,每组占一行,每行包含2个数s(s是小溪中的石柱数目)、y(y是小溪中的荷叶数目)。(0 <= s <= 10,0 <= y <= 10),输入文件直到EOF为止!
Output
对每组输入,输出有一行,输出最多能跳过的青蛙数目。
Sample Input
0 2 1 2
Sample Output
36
题目描述
青蛙从左岸向右岸跳,小溪中有石柱或者荷叶,求最多能跳过的青蛙数
解题思路
没别的办法,先从头开始一个个试吧
step 1:假设无石柱,荷叶只有1片,即river(0,1) 可得最多有2只青蛙跳到对岸,river(0,1)=2. 1.#1跳到y 2.#2跳到R 3.#1跳到R step 2: 假设无石柱,荷叶有n片,即river(0,n-1) 1.#1跳到y1 2.#2跳到y2 ... n-1.#n-1跳到n-1 n.#n跳到R ... 分析得,在无石柱的情况下,river(0,y)=y+1 step 3: 假设有1根石柱,1片荷叶,即river(1,1) 1.#1跳到y 2.#2跳到s 3.#1跳到s 4.#3跳到y 5.#4跳到R 6.#3跳到R 7.#1跳到y 8.#2跳到R 9.#1跳到R Jump(1,1)=4 经过分析,可将过程分为两部分: 1.上半部分青蛙:L→y→S 2.下半部分青蛙:L→y→R 然后,上半部分青蛙再由S→y→R 这样整个过程可以看作2个L→y→R过程 river(1,1)=2 * river(0,1) step 4: 假设有s根石柱,y片荷叶 river(s,y)=2 *river(s-1,y)
但是经过分析可以发现,不管石柱有多少,能过的青蛙数都等于前一个荷叶数能过青蛙的二倍,即river[i]=2*river[i-1],river[0]=y+1;源代码
#include<bits/stdc++.h> using namespace std; long long river[101]; int main() { int i,s,y; while(cin>>s>>y) { river[0]=y+1; for(i=1;i<=s;i++) river[i]=2*river[i-1]; cout<<river[s]<<endl; } return 0; }