A-悬崖

题目描述

小沙被困在两个巨大的墙壁之中快要被压死了,但是两个墙壁中间就是万丈悬崖,小沙想要多活一会,他脚底下有一个非常强大的弹跳鞋,每一次跳跃可以使他向着对面的墙壁飞行x米,但是他必须要踩上墙壁才能进行下一次跳跃,现已知两个墙壁中间间隔n米,并且每次跳跃两个墙壁之间的距离会减少1米,也就是说小沙在n秒后就会被压死,如果不考虑跳跃期间墙壁的移动,请问小沙最多能跳(飞)多少米。

两面墙壁都没有什么物品可以让小沙能够抓住从而挂在墙壁上,所以小沙要保证一直的跳跃才能不摔下悬崖

输入描述:

 

一行输入两个正整数 x,nx,nx,n

1≤x,n≤1091\leq x,n \leq 10^91≤x,n≤109

输出描述:

输出一个整数

示例1

输入

2 2

输出

4

说明

说明:小沙第一次跳跃两米,到对面墙壁,然后两个墙壁的距离变成1米,小沙继续跳到对面墙壁(此时虽然两个墙壁之间只有1米,但是小沙还是可以跳跃两米)例如:

可以看到虽然墙壁之间的距离只有一米,但是小沙还是可以跳两米远

代码如下:

#include<iostream>
 
 
int main(){
    long long int res = 0;
    int n, x;
    std::cin >> x >> n;
    if(x < n){
        std::cout << x;
    }
    else{
        while(n--){
        res += x;
    }
    std::cout << res;
    }
     
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
```python import copy class CliffWalkingEnv: """悬崖漫步环境""" def __init__(self, ncol=9, nrow=5): self.ncol = ncol # 定义网格世界的列 self.nrow = nrow # 定义网格世界的行 # 转移矩阵 P[state][action] = [(p, next_state, reward, done)] # 包含下一个状态和奖励 self.P = self.createP() def createP(self): # 初始化 P = [[[] for j in range(4)] for i in range(self.nrow * self.ncol)] # 4 种动作, change[0]:上, change[1]:下, change[2]:左, change[3]:右。坐标系原点(0,0) # 定义在左上角 change = [[0, -1], [0, 1], [-1, 0], [1, 0]] for i in range(self.nrow): for j in range(self.ncol): for a in range(4): # 位置在悬崖或者目标状态, 因为无法继续交互,任何动作奖励都为 0 if i == self.nrow - 1 and j > 0: P[i * self.ncol + j][a] = [(1, i * self.ncol + j, 0, True)] continue # 其他位置 next_x = min(self.ncol - 1, max(0, j + change[a][0])) next_y = min(self.nrow - 1, max(0, i + change[a][1])) next_state = next_y * self.ncol + next_x reward = -1 done = False # 下一个位置在悬崖或者终点 if next_y == self.nrow - 1 and next_x > 0: done = True if next_x != self.ncol - 1: # 下一个位置在悬崖 reward = -100 P[i * self.ncol + j][a] = [(1, next_state, reward, done)] return P ``` 代码的作用: - `import copy`:导入 copy 模块 - `class CliffWalkingEnv:`:定义名为 CliffWalkingEnv 的类 - `def __init__(self, ncol=9, nrow=5):`:定义类的初始化函数,其中 ncol 和 nrow 分别表示网格世界的列数和行数 - `self.ncol = ncol`:将输入的 ncol 赋值给类内部的 self.ncol - `self.nrow = nrow`:将输入的 nrow 赋值给类内部的 self.nrow - `self.P = self.createP()`:将类的转移矩阵 P 初始化为 createP() 函数的返回值 - `def createP(self):`:定义 createP() 函数来生成转移矩阵 P - `P = [[[] for j in range(4)] for i in range(self.nrow * self.ncol)]`:初始化 P 为空列表,其维度为 (ncol * nrow, 4),即每个状态都有四种动作 - `change = [[0, -1], [0, 1], [-1, 0], [1, 0]]`:定义 change 列表,其中每个元素表示一个动作的坐标变化,分别为上、下、左、右 - `for i in range(self.nrow):`:遍历网格世界的每一行 - `for j in range(self.ncol):`:遍历网格世界的每一列 - `for a in range(4):`:遍历四种动作 - `if i == self.nrow - 1 and j > 0:`:如果当前位置在悬崖或者终点,则任何动作奖励都为 0,此时将转移矩阵 P 的该状态和动作对应的值设为 [(1, i * self.ncol + j, 0, True)],表示只有该状态和动作概率为 1,下一个状态为当前状态,奖励为 0,终止状态为 True - `next_x = min(self.ncol - 1, max(0, j + change[a][0]))`:计算当前动作后下一个状态的横坐标 - `next_y = min(self.nrow - 1, max(0, i + change[a][1]))`:计算当前动作后下一个状态的纵坐标 - `next_state = next_y * self.ncol + next_x`:计算下一个状态的编号 - `reward = -1`:将奖励初始化为 -1 - `done = False`:将终止状态标志初始化为 False - `if next_y == self.nrow - 1 and next_x > 0:`:如果下一个状态是终点,则将终止状态标志设为 True - `if next_x != self.ncol - 1:`:如果下一个状态不是悬崖,则将奖励设为 -100 - `P[i * self.ncol + j][a] = [(1, next_state, reward, done)]`:将该状态和动作对应的转移概率、下一个状态、奖励、终止状态设为 [(1, next_state, reward, done)],表示只有该状态和动作概率为 1,下一个状态为 next_state,奖励为 reward,终止状态为 done - `return P`:返回生成的转移矩阵 P
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值