【bzoj2144】跳跳棋
2144: 跳跳棋
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 492 Solved: 244
[Submit][Status][Discuss]
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
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cmath>
- #include<ctime>
- #include<algorithm>
- using namespace std;
- #define INF 1000000000
- struct node{int v[];}root1,root2;
- int temp,temp1,temp2,ans,a[],b[];
- inline int read()
- {
- int x=,f=; char ch=getchar();
- while(!isdigit(ch)) {if(ch=='-') f=-; ch=getchar();}
- while(isdigit(ch)) {x=x*+ch-''; ch=getchar();}
- return x*f;
- }
- node dfs(int p[],int k)
- {
- node ans;
- for(int i=;i<=;i++) ans.v[i]=p[i];
- int t1=p[]-p[],t2=p[]-p[];
- if(t1==t2) return ans;
- if(t1<t2)
- {
- int step=min(k,(t2-)/t1);
- k-=step; temp+=step;
- ans.v[]+=step*t1; ans.v[]+=step*t1;
- }
- if(t1>t2)
- {
- int step=min(k,(t1-)/t2);
- k-=step; temp+=step;
- ans.v[]-=step*t2; ans.v[]-=step*t2;
- }
- if(k) return dfs(ans.v,k);
- else return ans;
- }
- bool operator!=(node a,node b){for(int i=;i<=;i++)if(a.v[i]!=b.v[i])return ;return ;}
- int main()
- {
- freopen("cin.in","r",stdin);
- freopen("cout.out","w",stdout);
- for(int i=;i<=;i++) a[i]=read();
- for(int i=;i<=;i++) b[i]=read();
- sort(a+,a+); sort(b+,b+);
- root1=dfs(a,INF); temp1=temp; temp=;
- root2=dfs(b,INF); temp2=temp; temp=;
- if(root1!=root2) {printf("NO\n"); return ;}
- if(temp1>temp2)
- {
- swap(temp1,temp2);
- for(int i=;i<=;i++)swap(a[i],b[i]);
- }
- ans=temp2-temp1;
- root1=dfs(b,ans);
- for(int i=;i<=;i++)b[i]=root1.v[i];
- int l=,r=temp1;
- while(l+<r)
- {
- int mid=(l+r)/;
- if(dfs(a,mid)!=dfs(b,mid)) l=mid;
- else r=mid;
- }
- if(dfs(a,l)!=dfs(b,l)) temp=r;
- else temp=l;
- printf("YES\n%d\n",ans+*temp);
- return ;
- }
【bzoj2144】跳跳棋的更多相关文章
- bzoj2144 跳跳棋 二分
[bzoj2144]跳跳棋 Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位 ...
- BZOJ2144跳跳棋——LCA+二分
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的 游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
- BZOJ2144: 跳跳棋
传送门 神题一道. 考虑题目性质.首先对于一个状态,只存在四种情况,即最左/右边的点跳到中间,中间的点跳到左/右.而对于一个状态,显然第一种情况的两种分支不能同时存在,那么题目就可以理解为从$(a,b ...
- bzoj2144: 跳跳棋(二分/倍增)
思维好题! 可以发现如果中间的点要跳到两边有两种情况,两边的点要跳到中间最多只有一种情况. 我们用一个节点表示一种状态,那么两边跳到中间的状态就是当前点的父亲,中间的点跳到两边的状态就是这个点的两个儿 ...
- BZOJ2144 跳跳棋[建模+LCA]
思维题,思路比较神仙. 个人思路过程:个人只想到了只要中间棋子开始向外跳了,以后就不应该向内跳了,这样很蠢.所以应该要么先向内跳一会,要么直接开始中间的向外跳.不知道怎么处理,就卡住了. 20pts: ...
- bzoj2144 【国家集训队2011】跳跳棋
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...
- [BZOJ2144]国家集训队 跳跳棋
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
- [BZOJ2144][国家集训队2011]跳跳棋
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上. 每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\),\(c\)这三个位置. 我们要通 ...
- 【LCA】bzoj 2144:跳跳棋
2144: 跳跳棋 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 248 Solved: 121[Submit][Status][Discuss] ...
随机推荐
- iOS开发之最近开发遇到的问题总结
1.Cannot create __weak reference in file using manual reference counting 解决办法: 点击工程-------->Build ...
- Leetcode 912. Sort an Array
class Solution: def sortArray(self, nums: List[int]) -> List[int]: return sorted(nums)
- 你必须知道的495个C语言问题,学习体会一
C语言作为一门古老的语言,其灵活性和容易出错都让人 又爱又恨,书籍<你必须知道的495个C语言问题>,使用问答的形式,告诉读者 C语言使用的各个方面的知识,包括一些冷知识等.以下,我要摘录 ...
- C/C++ 笔试题一
摘自 网络上的 笔试题,据说是华为的,考察的内容还算全面,也很细致: 答案 疏略 检查了下,应该没有什么大问题,但是 还是那句话,尽信之不如无,所以还是要自己思考 1.static有什么用途?(请至少 ...
- Ubuntu server 安装samba
安装Samba时,出现了一下问题: linux-image-generic***依赖出现问题,无法安装Samba. 使用apt-get update 更新,吓尿了,全部是忽略,源是系统自带的.改成其他 ...
- k8s api server ha 连接配置问题
常见的lb 负载有硬件的f5 big-ip ,同时对于互联网公司大家常用的是nginx haproxy 了解k8s 集群高可用的都知道 api server 是无状态的(etcd 解决了),但是 ...
- 开源的UML建模工具
StarUML 一个开源的UML建模工具 地址:http://staruml.sourceforge.net/en/ 效果图: 出处:http://www.cnblogs.com/zzy0471/ar ...
- linux基础命令复习
1.ls 查看文件和文件夹 1).ls -a 查看文件和文件夹,包括隐藏的 2).ls -l 查看文件和文件夹详情 3).ls -lh 查看文件和文件夹详情,自动生成文件大小单位 4).ls ...
- Oracle cursor_sharing 参数 详解
一. 官网的说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams042.htm#REFRN10025 ...
- bzoj 3501 PA2008 Cliquers Strike Back——贝尔数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3501 用贝尔三角形 p^2 地预处理 p 以内的贝尔数.可以模(mod-1)(它是每个分解下 ...