洛谷P1244 青蛙过河

P1244 青蛙过河

    • 362通过
    • 525提交
  • 题目提供者该用户不存在
  • 标签
  • 难度普及-
  • 时空限制1s / 128MB

提交 讨论 题解

最新讨论更多讨论

题目描述

有一条河,左边一个石墩(A区)上有编号为1,2,3,4,…,n的n只青蛙,河中有k个荷叶(C区),还有h个石墩(D区),右边有一个石墩(B区),如下图所示。n只青蛙要过河(从左岸石墩A到右岸石墩B),规则为:

(1)石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大小);

(2)青蛙可以:A→B(表示可以从A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D;

(3)当一个石墩上有多只青蛙时,则上面的青蛙只能跳到比它大1号的青蛙上面。

你的任务是对于给出的h,k,计算并输出最多能有多少只青蛙可以根据以上规则顺利过河?

输入输出格式

输入格式:

两个整数h,k

输出格式:

一个整数,表示最多能有多少只青蛙可以根据以上规则顺利过河。

输入输出样例

输入样例#1:

2 3

输出样例#1:

16分析:这道题很显然是一道递推的题,和汉诺塔问题差不多,影响答案的是荷叶的数量和石墩的数量,那么我们设f[i][j]表示有i个石墩,j个荷叶,最多能跳过去多少只青蛙.先从小的情况来考虑,f[0][j] = j + 1,很显然,先让一只青蛙跳到石墩上,然后其它青蛙跳到荷叶上,最后统一跳到石墩上.那么f[1][j]呢?有了另外一个石墩,我们可以先让尽量多的小号青蛙跳到D上,再让尽量多的大号青蛙跳到B上,最后让D上的青蛙跳到B上,这样我们可以先把B当作不存在,那么就是前一种情况f[0][j],然后把D当作不存在,还是前一种情况f[0][j],那么f[1][j]就是2*f[0][j].      再来分析一下f[2][j],跳到B上的和跳到一号石墩的青蛙数是2*f[0][j],跳到二号石墩的青蛙数就是f[1][j]了,因为我们只考虑二号石墩,忽略一号石墩,把二号石墩当作了终点,那么相当于只有一号石墩的这种情况,其他石墩就不能当作终点了。可以得到f[i][j] = sum{f[k][j]} + f[0][k](0 <= k < j),f[0][j]告诉了,那么我们可以化简这个式子,f[1][j] = 2*f[0][j],f[2][j] = 4*f[0][j],f[3][j] = 8*f[0][j],那么最终答案就是(k+1)*2^h.      比较值得回味的几个地方:1.定义状态看哪些量对答案有影响,最直接的就是把输入定义为状态.2.先分析小情况,一步一步推向一般情况.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

int h,k;

int main()
{
    scanf("%d%d",&h,&k);
    printf("%d\n",(k + 1) * (1 << h));

    return 0;
}
				
时间: 2024-12-16 18:21:39

洛谷P1244 青蛙过河的相关文章

洛谷 P1244 青蛙过河

P1244 青蛙过河 题目描述 有一条河,左边一个石墩(A区)上有编号为1,2,3,4,…,n的n只青蛙,河中有k个荷叶(C区),还有h个石墩(D区),右边有一个石墩(B区),如下图所示.n只青蛙要过河(从左岸石墩A到右岸石墩B),规则为: (1)石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大小): (2)青蛙可以:A→B(表示可以从A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D: (3)当一个石墩上有多只青蛙时,则上面的青蛙只能跳到比它大1号的青蛙上面. 你的任务是

洛谷P1244 青蛙过河 DP/思路

又是一道奇奇怪怪的DP(其实是思路题). 原文戳>>https://www.luogu.org/problem/show?pid=1244<< 这题的意思给的挺模糊,需要一定的人生经验理解能力. 题目想必已知,我就提几点可能会搞错的点吧. 1.题目说了青蛙可以:A→B(表示可以从A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D:但却不能跳到A,B上再跳回来.所以不可以脑补成汉内塔那种跳法. 2.青蛙只能跳到比它大1号的青蛙上面,而不是比他大的青蛙就行.所以不可以脑补

P1244 青蛙过河

P1244 青蛙过河 题目描述 有一条河,左边一个石墩(A区)上有编号为1,2,3,4,-,n的n只青蛙,河中有k个荷叶(C区),还有h个石墩(D区),右边有一个石墩(B区),如下图所示.n只青蛙要过河(从左岸石墩A到右岸石墩B),规则为: (1)石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大小): (2)青蛙可以:A→B(表示可以从A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D: (3)当一个石墩上有多只青蛙时,则上面的青蛙只能跳到比它大1号的青蛙上面. 你的任务是

洛谷 1516 青蛙的约会

题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这两只青蛙分别叫

洛谷 P1516 青蛙的约会(中国剩余定理CRT)

题目描述 两青蛙会相遇的条件[(x-y)+k(m-n)]%l=0 令a=m-n,b=l,c=x-y,所以(c+k*a)%b=0 -> aX+bY=c 方程有解,当且仅当c%Gcd(a,b)=0 令r=Gcd(a,b) 为什么(X*(c/r)%(b/r)+b/r)%(b/r)为最小解? 目标解aX+bY==c 有解的条件是c%r=0,也就是c=K*r 那么就办成了aX+bY=K*r 那么也就是解a*(X/K)+b(Y/K)=r 然后扩展欧几里得定理就是解a*X+b*Y=r 那么解出来X之后X就要乘

洛谷P1052 过河 动态规划

洛谷P1052 过河通过观察可以发现 这个点很稀疏 dp 有很长一段距离都是没有用的,那么我们可以采用离散化的思想 把这个距离压缩,但同时还要保证 对答案没有影响 如果 s==t 这时候我们需要特判 只要判断 pos[ i ] % s == 0 就可以知道是否踩到石子 然后因为 最多青蛙一次只跳了 10 假如 s == 9 t == 10 如果两个石子间的距离大于100 我们每次也可以 一步步的慢慢调整 ,其实总共只有10个状态,%10==1 %10==2 %10==3 然后我们就可以把距离 >

洛谷 【P1052】过河

P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度).坐标为0的点表示桥的起点,坐标为L的点表示桥的终点.青蛙从桥的起点开始,不停的向终点方向跳跃.一次跳跃的距离是S到T之间的任意正整数(包括S,T).当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥. 题目给出独木桥的长度

洛谷 P1052 过河

题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度).坐标为0的点表示桥的起点,坐标为L的点表示桥的终点.青蛙从桥的起点开始,不停的向终点方向跳跃.一次跳跃的距离是S到T之间的任意正整数(包括S,T).当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥. 题目给出独木桥的长度L,青蛙跳跃的距离

【洛谷P1052【NOIP2005提高T2】】过河

题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,--,L(其中L是桥的长度).坐标为0的点表示桥的起点,坐标为L的点表示桥的终点.青蛙从桥的起点开始,不停的向终点方向跳跃.一次跳跃的距离是S到T之间的任意正整数(包括S,T).当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥. 题目给出独木桥的长度L,青蛙跳跃的距离