2144: 跳跳棋

Description

跳跳棋是在一条数轴上进行的。棋子只能摆在整点上。每个点不能摆超过一个棋子。我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置。我们要通过最少的跳动把他们的位置移动成x,y,z。(棋子是没有区别的)跳动的规则很简单,任意选一颗棋子,对一颗中轴棋子跳动。跳动后两颗棋子距离不变。一次只允许跳过1颗棋子。  写一个程序,首先判断是否可以完成任务。如果可以,输出最少需要的跳动次数。

Input

第一行包含三个整数,表示当前棋子的位置a b c。(互不相同)第二行包含三个整数,表示目标位置x y z。(互不相同)

Output

如果无解,输出一行NO。如果可以到达,第一行输出YES,第二行输出最少步数。

Sample Input

1 2 3
0 3 5

Sample Output

YES
2
【范围】
100% 绝对值不超过10^9

  啊啊啊。曾祥瑞学长说,这是一道思考题。于是,我们都误以为这是一道数论题。后来才发现,自己实在是太NAIVE了。
  hzwer说:
    这道题广搜20分。
    但是,对于一个状态,例如2 3 7
    中间可以往两侧跳,即2 3 7->1 2 7 / 2 3 7->2 7 11
    两侧仅有一个能往中间跳,即2 3 7->3 4 7
    那么所有的状态就能表示为一棵二叉树,第一种情况为其两个儿子,第二种为其父亲
    问题转换为给定树上的两个结点,求其距离
    直接暴力可以得40分
    可以构造这样的数据
    1 2 1000000000
    99999998 99999999 1000000000
    这样左边要一直往中间跳上上亿次
    我们发现若记前两个数差t1,后两个数差t2,不妨设t1<t2
    则左边最多往中间跳(t2-1)/t1次
    然后只能右边往中间跳,是一个辗转相除的过程,即在logK的时间内我们可以用这种方法得到某个结点它向上K次后的结点,或者根节点,同时还可以顺便算下深度
    那么只要求始终两个状态的深度d1,d2,将较深的调整到同一深度
    然后二分/倍增求与lca的深度差x
    ans=2*x+abs(d1-d2)
  啊啊啊啊啊。实在不想多说了,二分O(log n)* 辗转相除O(log n),实在是太优了。现在仔细想来,这确实是一道思维题,很重要的是,末状态就是二者等距。这个模型确实很有实际意义。
  

 1 /**************************************************************
 2     Problem: 2144
 3     User: Doggu
 4     Language: C++
 5     Result: Accepted
 6     Time:0 ms
 7     Memory:820 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <algorithm>
12 struct data {int pos[4];}a,b;
13 int dep=0;
14 bool operator!=(data a,data b) {for( int i = 1; i <= 3; i++ ) if(a.pos[i]!=b.pos[i]) return 1;return 0;}
15 data cal(data x,int heig) {
16     while(heig) {
17         int d1=x.pos[2]-x.pos[1], d2=x.pos[3]-x.pos[2];
18         if(d1==d2) return x;
19         if(d1<d2) {
20             int t=std::min(heig,(d2-1)/d1);
21             heig-=t;dep+=t;
22             x.pos[1]+=t*d1;x.pos[2]+=t*d1;
23         } else {
24             int t=std::min(heig,(d1-1)/d2);
25             heig-=t;dep+=t;
26             x.pos[2]-=t*d2;x.pos[3]-=t*d2;
27         }
28     }
29     return x;
30 }
31 int main() {
32     for( int i = 1; i <= 3; i++ ) scanf("%d",&a.pos[i]);
33     for( int i = 1; i <= 3; i++ ) scanf("%d",&b.pos[i]);
34     std::sort(a.pos+1,a.pos+4);std::sort(b.pos+1,b.pos+4);
35     data t1=cal(a,0x3f3f3f3f);int d1=dep;dep=0;
36     data t2=cal(b,0x3f3f3f3f);int d2=dep;dep=0;
37     if(t1!=t2) printf("NO\n"), std::exit(0);
38     if(d1<d2) std::swap(d1,d2), std::swap(a,b);
39     int ans=d1-d2;a=cal(a,ans);
40     int lf=0, rg=d2;
41     while(lf<=rg) {
42         int mid=(lf+rg)>>1;
43         if(cal(a,mid)!=cal(b,mid)) lf=mid+1;
44         else rg=mid-1;
45     }
46     printf("YES\n%d\n",ans+2*lf);
47     return 0;
48 }
49 

模型架构

转载于:https://www.cnblogs.com/Doggu/p/bzoj2144.html

BZOJ 2144 跳跳棋相关推荐

  1. BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2144 是 hydro 的 BZOJ ...

  2. BZOJ 2144 跳跳棋(LCA+欧几里德+二分答案)

    跳跳棋 问题描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位 ...

  3. [bzoj2144]: 跳跳棋

    2144: 跳跳棋 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 689  Solved: 326 [Submit][Status][Discuss ...

  4. bzoj-2144 跳跳棋

    2144: 跳跳棋 题目链接 时间限制: 10 Sec 内存限制: 259 MB 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一 个简单的游戏: ...

  5. 跳跳棋(国家集训队,LCA,洛谷P1852,BZOJ[2144])

    文章目录 题目 思路 代码 题目 题目链接 描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有333颗棋子,分别在a,b,ca,b ...

  6. 【BZOJ - 2144】跳跳棋

    @跳跳棋@ @跳跳棋@ @题目描述@ @分析1@ @分析2@ @代码实现@ @END~@ @题目描述@ Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子 ...

  7. [BZOJ2144]国家集训队 跳跳棋

    题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...

  8. [数论系列一]C Looooops,跳跳棋,The Luckiest number,CF906D Power Tower,Minimal Power of Prime,仪仗队,LCMSUM

    文章目录 C Looooops description solution code 跳跳棋 description solution code The Luckiest number descript ...

  9. 洛谷 P1852 [国家集训队] 跳跳棋

    题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...

最新文章

  1. 7个IntelliJ IDEA必备插件,提高编码效率
  2. win10pin不可用进不去系统_解决win7系统下连接网络打印机不可用的处理方法
  3. 数据探索性分析_探索性数据分析
  4. Windows、Linux及Mac查看端口和杀死进程
  5. 极简代码(二)—— 转置 list of lists
  6. linux avi 转mp4,LINUX下有没有像格式工厂一样的媒体转换软件?比如RMVB转AVI 转MP4...
  7. [网络应用]Foobar2000界面入门:认识Foobar的UI系统,熟悉三种主流界面插件
  8. 可爱的HOOk技术(一)
  9. 基于ESP-IDF环境的ESP32-C3开发之No such file or directory
  10. Generative Adversarial Networks overview(1)
  11. 网安学习——信息收集
  12. 蓝桥杯 连续区间数(抖机灵做法)
  13. 用计算机弹歌旧梦一场歌词,早知惊鸿一场何必情深一往是什么歌 《旧梦一场》歌词哪里听...
  14. 如何对Hive Metastore进行权限控制
  15. 有哪些小而美的中小厂?
  16. 【Unity基础】人物控制的三种方式(键盘)、(鼠标)、(键鼠)
  17. html5的技术串讲,Web前端开发职业标准串讲(初级).pdf
  18. vue使用高德地图为信息窗体再添加点击事件
  19. 魅族手机突然显示无服务器,魅族Flyme6是悟空请来的?Bug竟然有这么多?
  20. CIE1964标准色度系统

热门文章

  1. 如何选择一个合适的物联网模块
  2. php文件更名,php如何批量给文件改名
  3. 天津大学计算机学院课表,天津大学软件实践1汇编语言课程教学大纲-天津大学计算机学院.PDF...
  4. 安恒 web类这可不是难题_如何消除您的前5个Web设计难题
  5. C#练习题答案: 字母战争 - 核打击【难度:3级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
  6. Mac解压rar文件工具
  7. UVALive - 2911 Maximum
  8. windows10网速监控(netspeedmonitor)
  9. 【BZOJ2563】阿狸和桃子的游戏 贪心
  10. (6)JsonResponse, Cookie, Session