1 条题解
-
0
自动搬运
来自洛谷,原作者为

深海鱼的眼泪
**搬运于
2025-08-24 21:22:50,当前版本为作者最后更新于2016-12-25 21:18:51,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
必须承认一开始看了很久才看懂题目哇QAQ
原来A和B也是石墩,青蛙也要按大小排不能一个一个跳过去哇QAQ
既然如此我们用 f[h][k] 表示 h 个石墩 k 片荷叶时最多的青蛙数
显然 f[0][k]=k+1
h=1时,让尽可能多的青蛙跳到D区石墩上(f[0][k]),再让尽可能多的青蛙跳到B石墩上(f[0][k]),最后让D区石墩上的青蛙跳到B上,所以 f[1][k]= f[0][k] + f[0][k]。
h=2时,让尽可能多的青蛙跳到D区的第一个石墩上(f[1][k]),再让尽可能多的青蛙跳到D区的第二个石墩上(f[0][k]),再让尽可能多的青蛙跳到B石墩上(f[0][k]),再让D区第二个石墩上的青蛙跳到B石墩上,最后让D区第一个石墩上的青蛙跳到B上,所以 f[2][k]=f[1][k]+ f[0][k] + f[0][k]。
以此类推。f[h][k]=f[h-1][k]+f[h-2][k]+…+f[1][k]+f[0][k]+f[0][k]
由于青蛙跳到D区石墩上和从D区跳到B上环境是一样的(即空石墩的数量是一样的),所以不用担心青蛙跳不到B上啦。
得到递推公式之后,让我们再来看一看。
f[1][k]= f[0][k] + f[0][k]=2*(k+1)
f[2][k]=f[1][k]+ f[0][k] + f[0][k] =f[1][k]+f[1][k]=2*2*(k+1)
f[3][k]=f[2][k]+ f[1][k]+ f[0][k] + f[0][k]=f[2][k]+f[2][k]=2*2*2*(k+1)
… f[h][k]=2*f[h-1][k]=(2^h)*(k+1)
于是我们得到了通项公式f[h][k] =(2^h)*(k+1)
下面是代码:
#include <iostream> using namespace std; int main(){ int h,k; cin>>h>>k; cout<<(k+1)*(1<<h); return 0; }位运算呢是出于省(zhuang)时(bi)的考虑。 还有就是题目中没有给出数据范围,原题中应该是 h<20 , k<1000 来着,所以不用 long long更不用高精度啦。
- 1
信息
- ID
- 244
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者