当前位置: 首页 > news >正文

[noip模拟]计蒜姬BFS

Description

兔纸们有一个计蒜姬,奇怪的是,这个计蒜姬只有一个寄存器X。兔纸们每次可以把寄存器
中的数字取出,进行如下四种运算的一种后,将结果放回寄存器中。
1.X=X+X
2.X=X-X
3.X=X*X
4.X=X/X
已知初始时寄存器里的值为A,兔纸们想要知道,是否能通过若干次操作,使得最终寄存器
里的值是B。如果可能,它们还想知道最少的操作次数。

Input

包含两个正整数A,B。

1 ≤ A,B ≤ 1000000000

Output

一个整数,即最少操作次数,如果不存在方案,则输出-1。

Sample Input

3 4

Sample Output

3
//
第一次:3/3=1
第二次:1+1=2
第三次:2*2=4



------------------------------------------------------分割线-----------------------------------------
最近有一种一巴掌拍死自己的冲动,我刚刚开始看到这道题,心想简单呗,就是一个BFS呗,最多加一点优化呗,于是两天过去了。。。。在我濒临崩溃之际,他终于过了

这道题虽然很简单,但是还是很有意思的,比较考思维,吃一蛰长一智,我很感谢自己把这道题坚持下来了
我一开始用的是很普通的BFS,一开始是超时,接着我把b为2的次方的情况给优化成O(1)的复杂度,但是还是要超时,百般无奈下,我看了题解
不得不说,很机智,反向BFS。。。。。。。
因为正向来的,a一不小心就会大于b,然后无限延伸下去,而反向来的话,当b到1就是极限了,所以总体来说的话缩小比加倍更加的优化
当我一个全新的程序出来以后,我还是一直WA,后来用Pascal程序提交算是过了,后来检查C++程序才终于发现,原来我忘了考虑a,b相等的情况

思路:反向缩小b,如果当
前值等于a就输出步数,值为1就输出步数+1,如果开平方和除以2都不能得到整数1就输出-1

我就提供一个反向BFS程序,正向的等我再去研究研究hash判重再说
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<queue>
 5 #include<iostream>
 6 #include<cstdlib>
 7 #include<cmath>
 8 #define maxn 500000000
 9 using namespace std;
10 
11 int a,b;
12 struct node{
13     int val,dep;
14 };
15 queue<node>q;
16 
17 int check(node x)
18 {
19     if(x.val==a)return x.dep;
20     if(x.val==1)return x.dep+1;
21     return 0;
22 }
23 
24 int main()
25 {
26     scanf("%d%d",&a,&b);
27     if(a==b)
28     {
29         printf("0");return 0;
30     }
31     q.push((node){b,0});
32     while(!q.empty())
33     {
34         node x=q.front();
35         q.pop();
36         if(x.val%2==0)q.push((node){x.val/2,x.dep+1});
37         int nxt=floor(sqrt(x.val*1.0));
38         if(pow(nxt,2)==x.val&&nxt!=1)q.push((node){nxt,x.dep+1});
39         if(check(x)!=0){
40             printf("%d",check(x));return 0;
41         }
42         
43     }
44     printf("-1");
45 }
View Code

 




转载于:https://www.cnblogs.com/Danzel-Aria233/p/7545296.html

相关文章:

  • Android零基础入门第63节:过时但仍值得学习的选项卡TabHost
  • 「vmware」虚拟机与主机共享目录
  • 找出潜在威胁 端点侦测与反制系统
  • Oracle 自适应游标
  • 读《自控力》| 时刻明确你真正想要什么
  • js面向对象
  • 【转载】xtrabackup原理及实施
  • 在Android应用程序中实现推送通知
  • Hbase源码分析:Hbase UI中Requests Per Second的具体含义
  • LINUX KERNEL SPINLOCK使用不当的后果
  • android——Tinker启蒙,献给热修复一脸懵逼的自己
  • Spring Boot——2分钟构建spring web mvc REST风格HelloWorld
  • python 模块包裹
  • no.6 字符串和格式化输入/输出02
  • 从零开始编写自己的C#框架(18)——Web层后端权限模块——菜单管理
  • 收藏网友的 源程序下载网
  • Android交互
  • classpath对获取配置文件的影响
  • co模块的前端实现
  • Java 23种设计模式 之单例模式 7种实现方式
  • Javascript基础之Array数组API
  • JavaWeb(学习笔记二)
  • JDK 6和JDK 7中的substring()方法
  • markdown编辑器简评
  • mongo索引构建
  • mysql中InnoDB引擎中页的概念
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Redis中的lru算法实现
  • Selenium实战教程系列(二)---元素定位
  • TypeScript实现数据结构(一)栈,队列,链表
  • WebSocket使用
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 浅谈Golang中select的用法
  • 悄悄地说一个bug
  • 推荐一个React的管理后台框架
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 用Visual Studio开发以太坊智能合约
  • 责任链模式的两种实现
  • 转载:[译] 内容加速黑科技趣谈
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (C++17) std算法之执行策略 execution
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (二开)Flink 修改源码拓展 SQL 语法
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)图像的%2线性拉伸
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)认识微服务
  • (转)VC++中ondraw在什么时候调用的
  • .bat文件调用java类的main方法
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .Net 应用中使用dot trace进行性能诊断
  • @DateTimeFormat 和 @JsonFormat 注解详解