N - 青蛙过河

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

3
6

Hint

 

题意:

左岸有个柱子,右岸有个柱子,河里有n个柱子,m个荷叶,柱子上可以堆叠青蛙,荷叶不可以,从左岸柱子出去的青蛙不能再回来,到达右岸的青蛙也不能再回来

分析:

找到每个柱子最多放多少青蛙,保证能借助荷叶回去

如果有m个荷叶4个柱子,青蛙最后从左岸出来,最先回到右岸,按相反顺序

首先分析第一个荷叶,假如其他荷叶已经放了最大限度的青蛙,这个荷叶只能放m+1个即a[1];这个荷叶的青蛙最后从左岸出来,最先回到右岸,所以第一个荷叶先空了;

然后第二个荷叶里的青蛙,可以先把第一个荷叶装到最大限度然后,在分到荷叶上,依次回右岸,a[2]=a[1]+m+1;

。。。。。依次进行下去

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
     long long int n,m,i,s,a[15];
     while(cin>>n>>m)
     {
         s=1+m;
         for(i=1;i<=n;i++)
         {
             if(i==1)
                a[i]=m+1;
             else
             a[i]=a[i-1]*2;;
             s+=a[i];
         }
         cout<<s<<endl;
     }
}

感受:

这个题我一开始也看不懂,就是先写的几组数找规律,然后进行分析。。。。。快哭了

### 青蛙过河问题的算法设计与实现 青蛙过河问题是经典的动态规划和广度优先搜索(BFS)应用之一。以下是基于不同场景下的解决方案。 #### 单只青蛙过河 对于单只青蛙过河的情况,通常涉及寻找最优路径使得最大跃距离最小化。此问题可以通过动态规划解决: 1. **状态定义**: 定义 `dp[j]` 表示到达第 j 块石头所需的最小代价。 2. **转移方程**: 对于每一块石头 i 和其后续石头 j, 更新 dp[j]: \[ dp[j] = \min(dp[j], \max(dp[i], |stones[i]-stones[j]|)) \] 3. **初始化**: 设置初始值为无穷大,起点设为零。 4. **结果返回**: 返回最后一块石头对应的 dp 值作为最终答案[^5]。 ```python def maxJump(stones): n = len(stones) dp = [float('inf')] * n dp[0] = 0 for i in range(n): for j in range(i+1, n): jump_length = abs(stones[i] - stones[j]) if dp[i] < float('inf'): dp[j] = min(dp[j], max(dp[i], jump_length)) return dp[-1] # 测试用例 print(maxJump([0, 2, 5, 6, 7])) ``` #### 多只青蛙互不干扰情况 当多只青蛙需要通过同一系列石块而无相互影响时,可视为多个独立的单只青蛙问题并行求解[^1]。 #### 双向青蛙交互模型 针对双向移动且存在越规则的情形,则需采用回溯加剪枝的方法来探索所有合法走法组合,并记录最短总步数: - 使用递归来模拟每一时刻的状态变化; - 利用集合存储已访问过的局面避免重复计算; - 终止条件为目标位置全部占据完成; 具体代码如下所示[^2]: ```python from collections import deque def frogs_move(start_state, end_state): visited = set() queue = deque([(start_state, "")]) while queue: current, path = queue.popleft() if current == end_state: return path if current not in visited: visited.add(current) moves = generate_legal_moves(current) for move in moves: next_pos = apply_move(move, current) queue.append((next_pos, path + str(move))) return None def generate_legal_moves(state): # 实现逻辑生成下一步可行动作列表 pass def apply_move(move, state): # 应用某个特定动作更新当前状态 pass ``` 上述伪代码框架提供了基本思路,实际开发还需补充细节函数如generate_legal_moves()以及apply_move()等辅助功能模块。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值