2144: 跳跳棋

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 642  Solved: 307

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

HINT

Source

【分析】

  神奇的题目。!!

ORZ hzwer

  这样考虑只用考虑往中间跳了,这样的话你当然不会傻傻地一步步跳,跟辗转相除差不多的,可以快速求出连续跳x步到的地方。

  于是你用倍增求LCA就能知道两点间路径的长度了。

  【我觉得厉害的地方就是转成树形,看出来是只用两边考虑往中间跳的。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0x7fffffff int a[][];
int mymin(int x,int y) {return x<y?x:y;} int ffind(int x,int y)
{
int t1=a[x][]-a[x][],t2=a[x][]-a[x][];
if(t1==t2) return ;
int xx;
if(t1<t2)
{
xx=mymin(y,(t2-)/t1);
y-=xx;
a[x][]+=xx*t1;a[x][]+=xx*t1;
}
else
{
xx=mymin(y,(t1-)/t2);
y-=xx;
a[x][]-=xx*t2;a[x][]-=xx*t2;
}
if(y) return ffind(x,y)+xx;
else return xx;
} int main()
{
for(int i=;i<=;i++) scanf("%d",&a[][i]);
for(int i=;i<=;i++) scanf("%d",&a[][i]);
sort(a[]+,a[]++);
sort(a[]+,a[]++);
int d1,d2;
for(int i=;i<=;i++) a[][i]=a[][i]; d1=ffind(,INF);
for(int i=;i<=;i++) a[][i]=a[][i]; d2=ffind(,INF);
if(a[][]!=a[][]||a[][]!=a[][]||a[][]!=a[][]) printf("NO\n");
else
{
if(d1<d2)
{
swap(d1,d2);
for(int i=;i<=;i++) swap(a[][i],a[][i]);
}
int ans=ffind(,d1-d2);
int l=,r=INF;
while(l<r)
{
int mid=(l+r)>>;
for(int i=;i<=;i++) a[][i]=a[][i]; d1=ffind(,mid);
for(int i=;i<=;i++) a[][i]=a[][i]; d2=ffind(,mid);
if(a[][]!=a[][]||a[][]!=a[][]||a[][]!=a[][])
{
l=mid+;
// for(int i=1;i<=3;i++) a[0][i]=a[3][i];
// for(int i=1;i<=3;i++) a[1][i]=a[4][i];
}
else r=mid;
}
printf("YES\n%d\n",ans+*l);
}
return ;
}

2017-04-05 09:13:21

【BZOJ 2144】 2144: 跳跳棋 (倍增LCA)的更多相关文章

  1. bzoj 2144: 跳跳棋——倍增/二分

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

  2. 【洛谷】1852:[国家集训队]跳跳棋【LCA】【倍增?】

    P1852 [国家集训队]跳跳棋 题目背景 原<奇怪的字符串>请前往 P2543 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个 ...

  3. BZOJ2144 跳跳棋[建模+LCA]

    思维题,思路比较神仙. 个人思路过程:个人只想到了只要中间棋子开始向外跳了,以后就不应该向内跳了,这样很蠢.所以应该要么先向内跳一会,要么直接开始中间的向外跳.不知道怎么处理,就卡住了. 20pts: ...

  4. 【LCA】bzoj 2144:跳跳棋

    2144: 跳跳棋 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 248  Solved: 121[Submit][Status][Discuss] ...

  5. [BZOJ 2144]跳跳棋

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

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

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

  7. 跳跳棋——二分+建模LCA

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

  8. 不一样的LCA——luoguP1852跳跳棋

    洛谷端题目链接 loj端题目链接 题目大意: 在一条数轴上进行跳跳棋游戏.棋子只能摆在整点上.每个点不能摆超过一个棋子.用跳跳棋完成:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动 ...

  9. P1852 跳跳棋 [LCA思想+二分答案]

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

随机推荐

  1. python匹配某个中文字符

    python2.7对中文的支持不好是众所周知的,现在遇到这样一个需求,要匹配某个中文字符.查了一个资料,思路就是转化为unicode进行比较,记录如下: line = '参考答案: A' # gbk ...

  2. css3中新增的样式使用方法

    在PC版开发中由于IE原因,我们很少用到css3,但随着平板和智能手机进入我们的生活,以及现在越来越流行,在手机版和平板版开发中我们就可以大胆的使用了,下面我们探讨常用几个css3属性: 1.css3 ...

  3. 爬虫--PyQuery

    什么是PyQuery? PyQuery 初始化 字符串初始化 from pyquery import PyQuery as pq html=""" <div> ...

  4. python设计模式之常用创建模式总结(二)

    前言 设计模式的创建模式终极目标是如何使用最少量最少需要修改的代码,传递最少的参数,消耗系统最少的资源创建可用的类的实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常 ...

  5. gmail注册时“此电话号码无法用于进行验证”

    网上有几个方法,有说不要改默认地点,有说验证时直接写+86手机号,试了以后还是不行. 我的方法:换成IE浏览器,就可以验证了.

  6. sicily 1259. Sum of Consecutive Primes

    Description Some positive integers can be represented by a sum of one or more consecutive prime numb ...

  7. 设置Git远程仓库

    1,注册一个GitHub账户,登陆GitHub账户,添加一个储存库 2,进入Ubuntu命令窗口,创建文件夹.如   mkdir   git echo "# first_git" ...

  8. Mac OS X 编译android内核 error: elf.h: No such file or directory 的解决方法

    1. 从网上下个elf.h放到scripts/mod/文件夹(http://www.rockbox.org/tracker/9006?getfile=16683) 2. 修改两个文件mk_elfcon ...

  9. SVM资料

    解释SMO算法比较好的文档 http://wenku.baidu.com/view/aeba21be960590c69ec3769e.html 参考博客: http://myjuno.blogbus. ...

  10. inux命令英文缩写的含义(方便记忆) 2

    linux常用命令的英文单词缩写 命令缩写: ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户rpm:redhat packa ...