1 条题解

  • 0
    @ 2025-8-24 21:22:51

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 深海鱼的眼泪
    **

    搬运于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
    上传者