noj加1乘2平方
广度优先搜索典例
00 题目
描述:
最简单的队列的使用
#include <iostream>
#include <queue>
using namespace std;
queue<int> q1;
int main()
{
int temp, x;
q1.push(5);//入队
q1.push(8);//入队
temp = q1.front();//访问队首元素
q1.pop();//出队
q1.empty();//判队列是否为空
q1.back();//返回队尾元素
q1.size();//返回队列长度
}
给定两个正整数m、n,问只能做加1、乘2和平方这三种变化,从m变化到n最少需要几次
输入:
输入两个10000以内的正整数m和n,且m小于n
输出:
输出从m变化到n的最少次数
输入样例:
1 16
输出样例:
3
01 思路0
01-1 类型
虽然看上去感觉有一些无处下手,但是实际上就是一个三叉树,并且要去去找 到达目标节点 的最低高度。
这个图转自加1乘2平方题解

很明显,这是个广搜典型题。
01-2 算法
以初始数字(如1)当作根结点,入队,出队,产生三个子节点next,对子节点筛选符合条件的继续进队
关于三个子结点的产生,可以设置标志位标记为0,1,2
0->当前值+1
1->当前值*2
2->当前值*当前值
对应我的change函数
对next值进行判断
当next为终点数字时,就停止,返回高度(高度需要变量来记)
当next>终点数字时,不再入队。
当next<终点数字时,入队,方便下一步找它的子节点。
在bfs主控函数中把队列走完,就能解决问题。
输出
02 代码0
1 //方法2
2 //按照题目要求使用队列,相应算法是广搜
3 #include<iostream>
4 #include<queue>
5 using namespace std;
6
7 queue<int> q;
8 int m,n;
9 int step[10000];
10 int used[10000];
11
12 int bfs();//广度优先搜索
13 int change(int now, int i);//三种变换
14 bool istarget(int now, int next);
15 //判断是否达到目标数字
16 int main(){
17 cin >> m >> n;
18 //始末位置
19 q.push(m);
20 //m入队
21 cout << bfs() << endl;
22 return 0;
23 }
24 int bfs(){
25 int next;
26 while(!q.empty() ){
27 int now = q.front();
28 q.pop();
29 used[now]=1;
30 for(int i=0; i<3; i++){
31 next = change(now,i);
32 //生成当前节点的下一节点(一共三个)
33 if(istarget(now, next)){
34 return step[next];
35 }//如果就达到目标,就返回走了几步,由于使用广搜,就是最短路径
36 }
37 }
38 return 0;//这点很重要,虽然code永远到不了这里
39 }
40
41 bool istarget(int now,int next){
42 if(next<=n && used[next]==0){//确保子节点未超过目标值且未被访问过
43 used[next]=1;
44 step[next] = step[now] + 1;//从当前到子节点需+1
45 //核心判断
46 if(next == n){
47 return true;
48 }
49 else{
50 q.push(next);
51 //如果不是就吧这个节点当成普通节点放入队列
52 }
53 }
54 return false;
55 }
56
57 int change(int now, int i){
58 if(i==0) return now+1;
59 if(i==1) return now*2;
60 else return now*now;
61 }
03 思路1
03-1 类型
动态规划,更为简洁,只需要一个main函数和两个指针
03-2 算法
从起始数字开始,我设置一个行走位逐个去走到终点
对i进行讨论
先设置基准步伐,比较i的路经长度和i-1的路径长度+1
当i为偶数,比较到达i的路径长度和i/2的路径长度+1
当i为平方数,(可以提前设置一个int 的i的根号,当t*t==i即为这个条件)比较到达i的路径长度和t的路径长度+1
算法原理,因为i是从m开始走的,所以天然不需要循环,只需不断地调用之前的结果进行比较就能得到新的结果,这就是动态规划的魅力所在。算法时间复杂度为O(m-n).
04 代码1
1 //加1乘2平方
2
3 #include<stdio.h>
4 #include<string.h>
5 #include<iostream>
6 #include<algorithm>
7 #include<cmath>
8 using namespace std;
9 const int maxn = 10000+50;
10 int dp[maxn],m,n;
11
12 //min函数内置了
13 int main(){
14 cin>>m>>n;
15 memset(dp,0x3f3f3f,sizeof(dp));
16 dp[m] = 0;
17 for(int i = m+1; i <= n; i++){
18 int t = sqrt(i);
19 dp[i]=min(dp[i],dp[i-1]+1);
20 if(i%2==0){
21 dp[i] = min(dp[i], dp[i/2]+1);
22 }
23 if(t*t == i){
24 dp[i] = min(dp[i],dp[t]+1);
25 }
26 }
27 cout << dp[n] << endl;
28 return 0;
29 }
noj加1乘2平方的更多相关文章
- Noj - 在线强化训练4
状态 题号 竞赛题号 标题 × 1092 A 童年的回忆——计算24 × 1145 B 求图像的周长 × 1144 C 农场灌溉问题 × 1202 D 数独游戏 × 1243 E 循环赛日程表 × 1 ...
- js原生方法传参的细节(面试必问)
废话不说,直接上题. slice(),接收两个参数,第一个为开始index(从0开始),第二个为结束的index(也是从0开始,但是不包括index本身,只到index-1).返回值是截取的数组,原数 ...
- 2078 Problem H Secret Message 中石油-未提交-->已提交
题目描述 Jack and Jill developed a special encryption method, so they can enjoy conversations without wo ...
- Bzoj 3781: 小B的询问 莫队,分块,暴力
3781: 小B的询问 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 426 Solved: 284[Submit][Status][Discuss ...
- 【TensorFlow篇】--Tensorflow框架初始,实现机器学习中多元线性回归
一.前述 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,T ...
- 委托学习总结(一)浅谈对C#委托理解
初入社会,对于我这个初级程序员来说要学的东西实在太多了,公司最近在做一个winform框架开发的桌面应用程序,众所周知,winform也好,webform也好,里面随处可见的事件驱动,有事件,当然也少 ...
- [jzoj]4216.【NOIP2015模拟9.12】平方和
Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...
- 190320运算符&数据类型
一.运算符 1.算术运算符 + 加 - 减 * 乘 / 除 ** 平方 // 整除 % 取余 2.比较运算符 == 等于 > 大于 < 小于 <= 小于等于 >= 大于等于 ! ...
- hash冲突解决和javahash冲突解决
其实就是四种方法的演变 1.开放定址法 具体就是把数据的标志等的对长度取模 有三种不同的取模 线性探测再散列 给数据的标志加增量,取模 平方探测再散列 给数据的标志平方,取模 随机探测再散列 把数据的 ...
随机推荐
- springcloud3(五) spring cloud gateway动态路由的四类实现方式
写这篇博客主要是为了汇总下动态路由的多种实现方式,没有好坏之分,任何的方案都是依赖业务场景需求的,现在网上实现方式主要有: 基于Nacos, 基于数据库(PosgreSQL/Redis), 基于Mem ...
- 第07课:GDB 常用命令详解(下)
本课的核心内容: disassemble 命令 set args 和 show args 命令 tbreak 命令 watch 命令 display 命令 disassemble 命令 当进行一些高级 ...
- linu命令进阶篇
预备知识: 本实验要求实验者具备如下的相关知识. 前面我们学习了linux的文件系统,了解的文件系统的结构,也学了linux档案的属性和权限,以及其设定. 当我们执行命令操作一个文件的时候,却不知道这 ...
- JAVA安全基础之代理模式(二)
JAVA安全基础之代理模式(二) 上篇讲到静态代理模式,这时候我们发现,一个代理类只能为一个类服务,如果需要代理的类很多,那么就需要编写大量的代理类,比较繁琐.所以就有了动态代理 动态代理 动态代理的 ...
- javassist 使用笔记
javassist Javassist 是一个开源的分析.编辑和创建Java字节码的类库.其主要的优点,在于简单,而且快速.直接使用 java 编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构 ...
- Excel中怎么快速选中区域
连续的表格选定 一张表格中会有不同的部分,若想选择某一个区域的数据的时候我们可以使用快捷键Ctrl+A,这是需要先选中第一个单元格,接着点击Ctrl+A即可选中连续的单元格. 汇总后需要汇 ...
- 2021ICPC网络赛第一场部分题解-The 2021 ICPC Asia Regionals Online Contest (I)
写在前面 本来应该6题的,结果不知道哪个铸币发了H的clar,当即把我们的思路转向三维几何上.当时我们还在想这三维计算几何的正确率有点太高了还在感叹ICPC选手的含金量,直到赛后我才知道这H题的铸币出 ...
- js 之k个一组翻转链表
题目描述 将给出的链表中的节点每\ k k 个一组翻转,返回翻转后的链表如果链表中的节点数不是\ k k 的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身.要求空间复杂度 \ O ...
- html2canvas实现截取指定区域或iframe的区域
官网文档: http://html2canvas.hertzen.com/ 使用的是 jquery 3.2.1 html2canvas 1.0.0-rc.7 截取根据id的指定区域: var ca ...
- curl 理解
PHP使用CURL详解 CURL是一个非常强大的开源库,支持很多协议,包括HTTP.FTP.TELNET等,我们使用它来发送HTTP请求.它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP ...