bzoj2144 跳跳棋
Description
跳跳棋是在一条数轴上进行的。棋子只能摆在整点上。每个点不能摆超过一个棋子。我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置。我们要通过最少的跳动把他们的位置移动成x,y,z。(棋子是没有区别的)跳动的规则很简单,任意选一颗棋子,对一颗中轴棋子跳动。跳动后两颗棋子距离不变。一次只允许跳过1颗棋子。 写一个程序,首先判断是否可以完成任务。如果可以,输出最少需要的跳动次数。
Input
第一行包含三个整数,表示当前棋子的位置a b c。(互不相同)第二行包含三个整数,表示目标位置x y z。(互不相同)
Output
如果无解,输出一行NO。如果可以到达,第一行输出YES,第二行输出最少步数。
Sample Input
0 3 5
Sample Output
2
【范围】
100% 绝对值不超过10^9
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 #include<cmath> 7 #include<queue> 8 #include<deque> 9 #include<set> 10 #include<map> 11 #include<ctime> 12 #define LL long long 13 #define inf 0x7ffffff 14 #define pa pair<int,int> 15 #define pi 3.1415926535897932384626433832795028841971 16 using namespace std; 17 struct zt{ 18 int a,b,c,dep; 19 }st,nd,rotst,rotnd; 20 inline void setmax(int &a,int &b,int &c) 21 { 22 int mx=a;if (mx<b)mx=b;if (mx<c)mx=c; 23 int mn=a;if (mn>b)mn=b;if (mn>c)mn=c; 24 b=a+b+c-mx-mn; 25 a=mn; 26 c=mx; 27 } 28 bool operator !=(const zt &a,const zt &b) 29 {return a.a!=b.a||a.b!=b.b||a.c!=b.c;} 30 bool operator ==(const zt &a,const zt &b) 31 {return a.a==b.a&&a.b==b.b&&a.c==b.c;} 32 int l,r,ans; 33 inline LL read() 34 { 35 LL x=0,f=1;char ch=getchar(); 36 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 37 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 38 return x*f; 39 } 40 inline void inpu(zt &a) 41 { 42 a.a=read();a.b=read();a.c=read(); 43 setmax(a.a,a.b,a.c); 44 } 45 inline void outpu(zt a) 46 {printf("%d %d %d %d\n",a.a,a.b,a.c,a.dep);} 47 inline void cal(zt &a) 48 { 49 int dea=a.b-a.a; 50 int deb=a.c-a.b; 51 if (dea==deb)return; 52 if (dea<deb) 53 { 54 int des=(deb-1)/dea; 55 a.dep+=des; 56 a.a+=des*dea; 57 a.b+=des*dea; 58 cal(a); 59 }else 60 if (dea>deb) 61 { 62 int des=(dea-1)/deb; 63 a.dep+=des; 64 a.c-=des*deb; 65 a.b-=des*deb; 66 cal(a); 67 } 68 } 69 inline zt gok(zt a,int k) 70 { 71 int dea=a.b-a.a; 72 int deb=a.c-a.b; 73 if (dea==deb||!k)return a; 74 if (dea<deb) 75 { 76 int des=min((deb-1)/dea,k); 77 k-=des; 78 a.dep+=des; 79 a.a+=des*dea; 80 a.b+=des*dea; 81 if (k)return gok(a,k); 82 else return a; 83 }else 84 if (dea>deb) 85 { 86 int des=min((dea-1)/deb,k); 87 k-=des; 88 a.dep+=des; 89 a.c-=des*deb; 90 a.b-=des*deb; 91 if (k)return gok(a,k); 92 else return a; 93 } 94 } 95 inline bool jud(int k) 96 { 97 return gok(st,k)==gok(nd,k); 98 } 99 int main() 100 { 101 inpu(st);setmax(st.a,st.b,st.c);rotst=st; 102 inpu(nd);setmax(nd.a,nd.b,nd.c);rotnd=nd; 103 cal(rotst); 104 cal(rotnd); 105 if (rotst!=rotnd) 106 { 107 printf("NO\n"); 108 return 0; 109 } 110 if (rotst.dep<rotnd.dep)swap(st,nd); 111 int dess=abs(rotst.dep-rotnd.dep); 112 st=gok(st,dess); 113 l=0;r=min(rotst.dep,rotnd.dep); 114 while (l<=r) 115 { 116 int mid=(l+r)>>1; 117 if (jud(mid)){ans=mid;r=mid-1;} 118 else l=mid+1; 119 } 120 printf("YES\n%d\n",dess+2*ans); 121 }
bzoj2144
转载于:https://www.cnblogs.com/zhber/p/4055359.html
bzoj2144 跳跳棋相关推荐
- [BZOJ2144]跳跳棋
[BZOJ2144]跳跳棋 试题描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过 ...
- bzoj-2144 跳跳棋
2144: 跳跳棋 题目链接 时间限制: 10 Sec 内存限制: 259 MB 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一 个简单的游戏: ...
- [bzoj2144]: 跳跳棋
2144: 跳跳棋 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 689 Solved: 326 [Submit][Status][Discuss ...
- BZOJ2144跳跳棋——LCA+二分
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的 游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
- bzoj2144: 跳跳棋(二分/倍增)
思维好题! 可以发现如果中间的点要跳到两边有两种情况,两边的点要跳到中间最多只有一种情况. 我们用一个节点表示一种状态,那么两边跳到中间的状态就是当前点的父亲,中间的点跳到两边的状态就是这个点的两个儿 ...
- 洛谷1852 BZOJ2144 跳跳棋 思维题
题目链接 题意: 坐标轴上告诉你三个互不相同的位置作为三个棋子的起点,再告诉你三个不同的位置作为三个棋子的终点,每次操作可以让一个棋子以另一个棋子为轴跳到对称位置,并且只能跳过一个棋子,问你是否能最终 ...
- BZOJ2144: 跳跳棋
求三个人从a,b,c这三个位置跳到x,y,z最少多少步.跳:任意选一颗棋子,对一颗中轴棋子跳动.跳动后两颗棋子距离不变.一次只允许跳过1颗棋子. 从它跳的性质出发,向内跳只有一种操作,而向外跳有两种 ...
- [BZOJ2144]国家集训队 跳跳棋
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
- 【BZOJ2144】跳跳棋
[题目 描述] 跳跳棋是在一条数轴上进行的. 棋子只能摆在整点上. 每个点不能摆超过一 个棋子. 我们用跳跳棋来做一个简单的游戏: 棋盘上有 3 颗棋子, 分别在 a, b, c 这三个位置. 我们要 ...
最新文章
- Linux加载DTS设备节点的过程(以高通8974平台为例)
- Jboss7或者wildfly部署war包的问题
- [转]查询oracle数据库的数据库名、实例名、ORACLE_SID
- 多进程Socket_Client
- 知识图谱论文阅读(二十一)【SIGIR2019】NGCF: Neural Graph Collaborative Filtering
- python做词典_Python实现创建字典
- hexo-Fluid主题使用手册
- Linux学习笔记:rpm程序包管理
- thinkphp3.2加载第三方函数库
- mac android sdk manager速度慢,android - SDK Manager无法在Mac上打开 - 堆栈内存溢出
- ebs 选择excel输出 后缀 html,Oracle EBS XML报表中数字的处理(Excel输出)
- iptables命令详解
- xmos驱动_独家!XMOS发表最新Xcore.ai“跨界处理器”
- 精挑细选几个JavaScript库和工具
- 在线订餐系统php心得体会_php网上订餐管理系统
- 现代三角钢琴音源 Native Instruments The Grandeur 1.2
- dart语言命名规范
- pandas教程(上)
- python 方波信号_python实现周期方波信号频谱图
- ChucK学习笔记(一)——下载与安装