题目描述

给你两个数 \(x\),\(y\)

可以对 \(x\) 进行 \(+1,-1\) 或 \(\times 2\) 的操作

问最少操作多少次后变为 \(y\)

\(x,y \leq 10^{18}\)

分析

将问题转化为从 \(y\) 变为 \(x\),可以进行 \(+1,-1\) 或 \(\div 2\) 的操作

之所以这样做,是因为转化题意之后操作更受约束

如果当前值为偶数,则只能除以 \(2\)

如果当前值为奇数,则只能执行加 \(1\) 或减 \(1\) ,再除以 \(2\)

因为如果要加更多的数,完全可以在除以 \(2\) 之后再加

相比之下,你可以随时加 \(1\) 或乘 \(2\),所以有更多的分支

如果你把它想象成一个根树遍历,那就好像如何重复地找到父对象要比探索所有子对象简单得多

这样做复杂度看起来还是 \(2^{logy}=y\)

实际上,若 \(y\) 为偶数,只会有 \(y/2\) 一个分支

若 \(y\) 为奇数,会有 \((y+1)/2\) 和 \((y-1)/2\) 两个分支

而且这两个数是相邻的,设为 \(a,a+1\)

如果 \(a\) 为奇数,下一层递归会有 \((a+1)/2,(a-1)/2,(a+1)/2\) 三个分支

如果我们采用记忆化搜索的方式,只会递归到两个分支

同样若 \(a\) 为偶数,下一层递归会有 \(a/2,a/2,(a+2)/2\) 三个分支

记忆化后也变为了两个分支

因为每一次都会除以 \(2\),所以最多递归 \(log\) 层

而每一层只有两个不同的数,所以最终的状态是 \(log\) 级别的

代码

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<map>
#define rg register
inline int read(){
rg int x=0,fh=1;
rg char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') fh=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*fh;
}
long long n,m;
std::map<long long,long long>mp;
long long dfs(rg long long now){
if(mp.find(now)!=mp.end()) return mp[now];
if(now<=n) return n-now;
rg long long nans=now-n;
if(now&1){
nans=std::min(nans,std::min(dfs((now-1)/2),dfs((now+1)/2))+2);
} else {
nans=std::min(nans,dfs(now/2)+1);
}
return mp[now]=nans;
}
int main(){
scanf("%lld%lld",&n,&m);
if(n>=m){
printf("%lld\n",n-m);
return 0;
}
printf("%lld\n",dfs(m));
return 0;
}

AtCoder Beginner Contest 188 F - +1-1x2 思维题的更多相关文章

  1. AtCoder Beginner Contest 188 D - Snuke Prime (思维,差分)

    题意:你需要订阅一些服务,每个服务每天需要花费\(c_i\),要从第\(a_i\)用到第\(b_i\)天,你可以购买会员,会员每天需要花费\(C\),但是这天的服务不用再另花钱了,问你订阅这些服务的最 ...

  2. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  3. AtCoder Beginner Contest 213 F题 题解

    F - Common Prefixes 该题也是囤了好久的题目了,看题目公共前缀,再扫一眼题目,嗯求每个后缀与其他后缀的公共前缀的和,那不就是后缀数组吗?对于这类问题后缀数组可是相当在行的. 我们用后 ...

  4. AtCoder Beginner Contest 261 F // 树状数组

    题目链接:F - Sorting Color Balls (atcoder.jp) 题意: 有n个球,球有颜色和数字.对相邻的两球进行交换时,若颜色不同,需要花费1的代价.求将球排成数字不降的顺序,所 ...

  5. AtCoder Beginner Contest 260 F - Find 4-cycle

    题目传送门:F - Find 4-cycle (atcoder.jp) 题意: 给定一个无向图,其包含了S.T两个独立点集(即S.T内部间的任意两点之间不存在边),再给出图中的M条边(S中的点与T中的 ...

  6. AtCoder Beginner Contest 253 F - Operations on a Matrix // 树状数组

    题目传送门:F - Operations on a Matrix (atcoder.jp) 题意: 给一个N*M大小的零矩阵,以及Q次操作.操作1(l,r,x):对于 [l,r] 区间内的每列都加上x ...

  7. AtCoder Beginner Contest 249 F - Ignore Operations // 贪心 + 大根堆

    传送门:F - Keep Connect (atcoder.jp) 题意: 给定长度为N的操作(ti,yi). 给定初值为0的x,对其进行操作:当t为1时,将x替换为y:当t为2时,将x加上y. 最多 ...

  8. AtCoder Beginner Contest 247 F - Cards // dp + 并查集

    原题链接:F - Cards (atcoder.jp) 题意: 给定N张牌,每张牌正反面各有一个数,所有牌的正面.反面分别构成大小为N的排列P,Q. 求有多少种摆放方式,使得N张牌朝上的数字构成一个1 ...

  9. AtCoder Beginner Contest 133 F Colorful Tree

    Colorful Tree 思路: 如果强制在线的化可以用树链剖分. 但这道题不强制在线,那么就可以将询问进行差分,最后dfs时再计算每个答案的修改值, 只要维护两个数组就可以了,分别表示根节点到当前 ...

随机推荐

  1. Codeforces Round #631 (Div. 1) A-C

    在 \(\text{Div. 2/3}\) 混了一个多月后,四个号终于都上紫了,也没用理由不打 \(\text{Div. 1}\) 了.这是我人生中的第一场 \(\text{Div .1}\) ,之前 ...

  2. Struts2-059 漏洞复现

    0x00 漏洞简介 Apache Struts框架, 会对某些特定的标签的属性值,比如id属性进行二次解析,所以攻击者可以传递将在呈现标签属性时再次解析的OGNL表达式,造成OGNL表达式注入.从而可 ...

  3. 配合php伪协议利用文件包含漏洞

    文章来源: https://blog.csdn.net/zpy1998zpy/article/details/80598768?utm_medium=distribute.pc_relevant.no ...

  4. 【升级版】如何使用阿里云云解析API实现动态域名解析,搭建私有服务器【含可执行文件和源码】

    原文地址:http://www.yxxrui.cn/article/179.shtml 未经许可请勿转载,如有疑问,请联系作者:yxxrui@163.com 我遇到的问题:公司的网络没有固定的公网IP ...

  5. 现代JavaScript—ES6+中的Imports,Exports,Let,Const和Promise

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://www.freecodecamp.org/news/learn-modern-jav ...

  6. React组件的state和props

    React组件的state和props React的数据是自顶向下单向流动的,即从父组件到子组件中,组件的数据存储在props和state中.实际上在任何应用中,数据都是必不可少的,我们需要直接的改变 ...

  7. 1.Redis基础命令

    重要概念 redis是单线程模型,所有命令都会进入一个队列,然后依次被执行. 全局命令 >>>select dbindex #切换数据库,默认有16个库,库标识符为0-15 > ...

  8. 魔改redis之添加命令hrandmember

    魔改redis之添加命令hrandmember 目录 魔改redis之添加命令hrandmember 正文 前言 Set类型与srandmember命令 Hash类型对比Set类型 hrandmemb ...

  9. Singleton Pattern -- 不一样的单例模式

    Singleton Pattern -- 单例模式 单例模式是用来创建一个只能又一个实例的对象. 单例模式类图如下. 单例模式有两大好处: (1)对于频繁使用的对象,可以省略创建对象所话费的时间,这对 ...

  10. 什么情况下调用doGet()和doPost()?

    默认情况是调用doGet()方法,JSP页面中的Form表单的method属性设置为post的时候,调用的为doPost()方法: 为get的时候,调用deGet()方法.