2144: 跳跳棋

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

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

思路
bzoj 2144 跳跳棋 2017.6.2 by xlj 
难题一道 很不好想 
从题目条件中看似6种状态 
但因为一个棋子不能跳过两个棋子
如果 1 4 10 此时右边的就不能跳 因为越过两个棋子了 
所以只有三种(中间的可以跳两边&离中间棋子距离近的可以跳) 
可以把这三种状态看成一棵树
此时可以设棋子为x,y,z; 
设y-x=t1 z-y=t2
当t1==t2的时候就没有办法跳了 这个状态就是树根了
如果t1<t2 最多跳(t2-1)/t1步  t2>t1 同理 
然后类似gcd的方法求树根 (t1,t2)->(t1-t2,t2) 
从给出的a1,b1,c1往上推出数根
a2,b2,c2也是一样
如果树根不同 代表不能完成 输出NO
如果相同 先把两个状态深度调为一样 再往上找(LCA) 
这里用的是二分法找 
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define inf 1000000000
using namespace std;
int a[5],b[5];
struct node{int a[5];
};
int tmp,ans;
node cal(int *a,int k)//在树上往上跳的 函数 k是跳的步数 跳到根就结束
{node ans;int t1=a[2]-a[1];int t2=a[3]-a[2];for(int i=1;i<=3;i++) ans.a[i]=a[i];if(t1==t2) return ans;if(t1<t2){int t=min(k,(t2-1)/t1);k-=t;tmp+=t;ans.a[2]+=t*t1;ans.a[1]+=t*t1;}else {int t=min(k,(t1-1)/t2);k-=t;tmp+=t;ans.a[2]-=t*t2;ans.a[3]-=t*t2;}if(k) return cal(ans.a,k);else return ans;
}
bool operator !=(node xx,node yy){//重载!比较结构体 for(int i=1;i<=3;i++) if(xx.a[i]!=yy.a[i]) return 1;return 0;
}
int main(){ for(int i=1;i<=3;i++)    scanf("%d",&a[i]);for(int i=1;i<=3;i++)    scanf("%d",&b[i]);sort(a+1,a+4);    sort(b+1,b+4);node t1=cal(a,inf);int d1=tmp;tmp=0;node t2=cal(b,inf);int d2=tmp;tmp=0;//往上找 找到最上面 y-x==z-y 的树根 if(t1!=t2) {puts("NO");return 0;    }if(d1>d2){swap(d1,d2);for(int i=1;i<=3;i++)swap(a[i],b[i]);}ans=d2-d1;//深度大的就往上调 t1=cal(b,ans);for(int i=1;i<=3;i++) b[i]=t1.a[i];int l=0,r=d1;while(l<=r)//二分法找LCA {int mid=(l+r)>>1;if(cal(a,mid)!=cal(b,mid))l=mid+1;//不等就网上找 else r=mid-1;//如果相等了 还可能在答案那个节点的下面 }puts("YES");printf("%d",ans+2*l);return 0;
}

[bzoj2144]: 跳跳棋相关推荐

  1. [BZOJ2144]跳跳棋

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

  2. bzoj2144 跳跳棋

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

  3. bzoj-2144 跳跳棋

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

  4. BZOJ2144跳跳棋——LCA+二分

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

  5. bzoj2144: 跳跳棋(二分/倍增)

    思维好题! 可以发现如果中间的点要跳到两边有两种情况,两边的点要跳到中间最多只有一种情况. 我们用一个节点表示一种状态,那么两边跳到中间的状态就是当前点的父亲,中间的点跳到两边的状态就是这个点的两个儿 ...

  6. 洛谷1852 BZOJ2144 跳跳棋 思维题

    题目链接 题意: 坐标轴上告诉你三个互不相同的位置作为三个棋子的起点,再告诉你三个不同的位置作为三个棋子的终点,每次操作可以让一个棋子以另一个棋子为轴跳到对称位置,并且只能跳过一个棋子,问你是否能最终 ...

  7. BZOJ2144: 跳跳棋

    求三个人从a,b,c这三个位置跳到x,y,z最少多少步.跳:任意选一颗棋子,对一颗中轴棋子跳动.跳动后两颗棋子距离不变.一次只允许跳过1颗棋子.  从它跳的性质出发,向内跳只有一种操作,而向外跳有两种 ...

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

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

  9. 【BZOJ2144】跳跳棋

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

最新文章

  1. Vivado提高综合和实现的速度
  2. Centos中不从skel目录里向其中复制任何文件错误的解决方法
  3. java aac rtp封装_分享一段H264视频和AAC音频的RTP封包代码
  4. 我精心珍藏的Python代码技巧
  5. 加量不加价!极速人脸检测库libfacedetection升级v3版,新增五点检测
  6. 《网络管理员考试案例导学》复习重点
  7. docker springboot读取配置文件_Docker从入门到掉坑(三):容器太多,操作好麻烦
  8. nested exception is java.lang.UnsatisfiedLinkError: no jacob-1.19-x64 in java.library.path
  9. matlab2c使用c++实现matlab函数系列教程-log函数
  10. [ZJOI2008]生日聚会
  11. c++ sort排序函数
  12. 计算机英语听力速记...,2018计算机考研英语听力速记技巧才是王道
  13. 怎样查看PPT中的字数
  14. Linux系统/usr/local/src /usr/local是什么目录
  15. animate发布html5教程,Adobe Animate CC 中的 HTML 发布模板 - Adobe Animate 用户指南
  16. iPhoneX 适配
  17. CAD、3dmax等Autodesk系列软件安装报错1603解决办法
  18. 干货!SpareNet:基于样式和对抗性渲染的点云补全
  19. CVE-2014-6271-bash shellshock-破壳漏洞复现
  20. 一文读懂CentOS 8 安装JDK 11:配置JAVA_HOME环境变量

热门文章

  1. 事件起泡 Event bubbling
  2. Axure 9 修改默认字体
  3. 存储IP地址,到底用什么数据类型相对比较好
  4. Your IP address is spelled incorrectly问题排查
  5. Design Compiler工具学习笔记(7)
  6. 用友U9V28应用中设置sa密码问题
  7. Docker 镜像仓库 Harbor 部署 及 跨数据复制
  8. KaLi Linux 2019.2安装netspeed
  9. PgMP: Program Management Professional Exam Study Guide
  10. JavaSwing编程总结