给定终点n,从1到n,或+1,或*2,求最小步数(二进制思想)

例子

n从1开始,可以对n加1,或者加倍,要使n为2014的步数

思路

重点:二进制思想

通过移位的方式:2014的二进制:111110 11110 

一开始是0000 0000 0001,乘以2相当于左移一位变成0010,然后加1后是0011,如此反复形成1111是要6步,形成11110(乘以2左移一位)是7步,形成11111(加1操作)要8步,以此类推:形成11111 0 1要11步,然后以最后那个1为起始形成11110需要7步,所以11+7=18

结论

2014的二进制为11111011110,需要的步数是2的最大幂次(加倍)加上最高位后面为1(加1)的个数。

2014>2^10;10+8=18

代码实现

int minimum_step(int n){
     vector<int> dp(n+1);
     dp[1]=0;
     for(int i=2;i<=n;i++){    
         dp[i]=dp[i-1]+1;
          if(i%2==0)
             dp[i]=min(dp[i],dp[i/2]+1);      
     }
     return dp[n];
 }

转载

本文转载自:https://www.cnblogs.com/huangzzz/p/8525535.html

你和小 A 被困在一个 N×N 的方形迷宫中,每个房间的中心都标有一个整数,范围在 0 到 K-1 之间。初始时,你们位于左上角的房间 (0,0),目标是通过一系列移动到达右下角的房间 (N-1,N-1)。迷宫的规则如下: 挑战者从初始房间 (0,0) 出发,终点是右下角的 (N-1,N-1) 处的格子,每一步可以选择沿着水平/垂直/对角线的方向移动到下一个格子。 经过的房间数字必须严格按顺序循环:0,1,2,…,K-1,0,1,2,…,K-1,0,1,2,… 。 途中对迷宫每一个房间恰好都经过一次(仅一次)。 路径中不可以出现交叉路线,比如之前从 (0,0) 移动到 (1,1),那么再从 (1,0) 移动到 (0,1) 的线路就会出现交叉。 为方便表示,对可以行进的所有八个方向进行了数字编号(示例图略);行进路径可用包含 0…7 之间数字的字符串表示,如迷宫示例对应答案是 41255214。 图片1.png 现请你帮小 A 规划行进路径并输出。若有多条路径,输出字典序最小的;若不存在路径,输出 -1。 你和小 A 被困在一个 N×N 的方形迷宫中,每个房间的中心都标有一个整数,范围在 0 到 K-1 之间。初始时,你们位于左上角的房间 (0,0),目标是通过一系列移动到达右下角的房间 (N-1,N-1)。迷宫的规则如下: 挑战者从初始房间 (0,0) 出发,终点是右下角的 (N-1,N-1) 处的格子,每一步可以选择沿着水平/垂直/对角线的方向移动到下一个格子。 经过的房间数字必须严格按顺序循环:0,1,2,…,K-1,0,1,2,…,K-1,0,1,2,… 。 途中对迷宫每一个房间恰好都经过一次(仅一次)。 路径中不可以出现交叉路线,比如之前从 (0,0) 移动到 (1,1),那么再从 (1,0) 移动到 (0,1) 的线路就会出现交叉。 为方便表示,对可以行进的所有八个方向进行了数字编号(示例图略);行进路径可用包含 0…7 之间数字的字符串表示,如迷宫示例对应答案是 41255214。 图片1.png 现请你帮小 A 规划行进路径并输出。若有多条路径,输出字典序最小的;若不存在路径,输出 -1。 输出一行表示答案。若存在答案输出路径,否则输出 -1。 用c++实现
最新发布
07-17
先吃饭吧(tasty) 【题目描述】 有一张 n 个点 m 条边的无向图,每条边上有一个小于 k 的权值 w。 在接下来的 r 天中,麻油每天都会从 1 号节点沿图中的边一直走,直到走到 n 号节 点结束。将第 i 天行走过程中经过的边依次连成一个 k 进制数(最先经过的在最高位), 并忽略前导零后记为 bi。 再将 b1, b2, . . . , br 依次拼为一个数(b1 在最高位),得到 x。 定义 f(x) 表示 [1..x] 中有多少个数 v 满足 k 进制中不存在相邻的两位 vi−1, vi 满足 k vi+1 = k vi−1+1 √ vi + 1 = √ vi−1 + 1。其中 vi 表示 v 在 k 进制下的第 i 位。 现在麻油想问你,在所有可能的情况中 f(x) 可能取到的最小值。 【输入格式】 从文件 tasty.in 中读入数据。 第一行包含两个正整数 n, m, k, r,表示题目描述中的 n, m, k, r。 接下来 m 行,每行输入三个数 ui , vi , wi 表示一条连接 ui , vi 边权为 wi 的无向边, 保证 1 ≤ ui , vi ≤ n, 0 ≤ wi < k。保证当 1 ∈ {ui , vi} 时,wi > 0。 【输出格式】 输出到文件 tasty.out 中。 输出共一行,表示在所有可能的情况中 f(x) 可能取到的最小值 mod (109 + 7) 是 多少。 【样例 1 输入】 1 3 4 3 1 2 2 1 1 3 3 2 1 4 1 2 2 5 2 3 0 【样例 1 输出】 1 3 该样例满足 1 的要 【样例 2】 见选手目录下的 tasty/tasty2.in 与 tasty/tasty2.ans。 该样例满足 1 的要 【样例 3】 见选手目录下的 tasty/tasty3.in 与 tasty/tasty3.ans。 该样例满足 2 的要 【样例 4】 见选手目录下的 tasty/tasty4.in 与 tasty/tasty4.ans。 该样例满足 3 的要 【样例 5】 见选手目录下的 tasty/tasty5.in 与 tasty/tasty5.ans。 该样例满足 4~6 的要 【样例 6】 见选手目录下的 tasty/tasty6.in 与 tasty/tasty6.ans。 该样例满足 7~10 的要 【样例 7】 见选手目录下的 tasty/tasty7.in 与 tasty/tasty7.ans。 该样例满足 13~15 的要 【样例 8】 见选手目录下的 tasty/tasty8.in 与 tasty/tasty8.ans。 该样例满足 16~20 的要 【子任务】 数据点 n k r 性质 A 1 ≤ 5 ≤ 3322 × 104 ≤ 2109 31033 4 ∼ 6 ≤ 30 是 7 ∼ 10 ≤ 109 11, 123 1315 ≤ 30 否 16 ∼ 20 ≤ 109 性质 A: 满足 m = n − 1, ∀1 ≤ i ≤ m, ui = i, vi = i + 1 对于所有数据,满足 m ≤ 2 × 105,保证图联通,但不保证无自环且无重边。
03-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值