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.开放定址法 具体就是把数据的标志等的对长度取模 有三种不同的取模 线性探测再散列 给数据的标志加增量,取模 平方探测再散列 给数据的标志平方,取模 随机探测再散列 把数据的 ...
随机推荐
- Pytest 系列(24)- allure 环境准备
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html allure 和 pytest 相 ...
- web服务器之Ser-U和NFS
1. Ser-U加载页面目录/文件列表 2. Ser-U下载文件 3. NFS服务器加载目录/文件列表 4. NFS服务器下载文件 4. 对比分析 Ser-U服务器在传输服务器端的目录时,使用的为xm ...
- MacOS安装和卸载Java
安装java 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 设 ...
- Vue状态管理Vuex简单使用
状态管理保存在store\index.js中,简单说明如下 import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export def ...
- vue项目 'node-sass'问题
Cannot find module 'node-sass' 解决办法: 运行命令:cnpm install node-sass@latest 即可解决,( 网络差的同学可以选择重新下载no-modu ...
- 使用easyui进行上左右布局
在后台管理系统开发的过程中,上左右的布局是最常见的页面布局方式,现在我们来看看使用easyui这个jquery前端框架如何快速搭建一个可用的页面框架. 1.在页面中引入easyui所需的文件 1 &l ...
- io流-缓冲流
单独去数据时,数据按块读入缓冲区,其后的操作则直接访问缓冲区 但是用 BufferedInputStream读取字节文件时,
- Expression 表达式动态生成
http://blog.csdn.net/duan1311/article/details/51769119 以上是拼装和调用GroupBy的方法,是不是很简单,只要传入分组列与合计列就OK了! 下面 ...
- windows中ren(rename-重命名)命令的使用方法
脚本(*.dat文件): cd /d %~dp0 ren * *.mp3
- 308 day06_线程、同步
day06 [线程.同步] 主要内容 线程 同步 线程状态 教学目标 能够描述Java中多线程运行原理 能够使用继承类的方式创建多线程 能够使用实现接口的方式创建多线程 能够说出实现接口方式的好处 ...