2144: 跳跳棋

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 248  Solved: 121
[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


  暴力广搜有20分。。
  我们转化一下问题。。
  一次操作分为两种情况: 1)中间的棋子跳 2)两边的棋子中的一个跳(一次只允许跳过1颗棋子)。
  我们可以进一步转化模型
  样例中的图就是两边的棋子跳。
  我们发现这样相当于是中间的跳出来。。
  所以我们设中间跳两边为该状态节点的两个儿子。
  而两边跳中间是该节点的父亲节点。
  然后树上暴力有40.
  100: 先找两种状态的最终祖先(两边到中间距离相等(没有父节点))。
  然后如果最终祖先不等则NO
  相等那么把深度大的先提到同一深度
  然后LCA
  

 #include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm> using namespace std; inline int in()
{
int x=,f=;char ch=getchar();
while((ch<''||ch>'')&&ch!='-')ch=getchar();
if(ch=='-')f=-,ch=getchar();
while(ch<=''&&ch>='')x=x*+ch-'',ch=getchar();
return x*f;
} struct data{
int a[];
}; int a[],b[],tem=; data up(int c[],int k)
{
data t;
int t1=c[]-c[],t2=c[]-c[];
for(int i=;i<=;i++)t.a[i]=c[i];
if(t1==t2)return t;
else if(t1<t2)
{
int ans=min(k,(t2-)/t1);
tem+=ans;k-=ans;
t.a[]+=ans*t1,t.a[]+=ans*t1;
}
else
{
int ans=min(k,(t1-)/t2);
tem+=ans,k-=ans;
t.a[]-=ans*t2,t.a[]-=ans*t2;
}
if(k)return up(t.a,k);
else return t;
} bool operator!=(data a,data b)
{
for(int i=;i<=;i++)if(a.a[i]!=b.a[i])return ;
return ;
} int main()
{
for(int i=;i<=;i++)a[i]=in();
for(int j=;j<=;j++)b[j]=in();
sort(+a,+a+);
sort(+b,+b+);
data t1=up(a,1e9);int d1=tem;tem=;
data t2=up(b,1e9);int d2=tem;tem=;
if(t1!=t2){
printf("NO");
return ;
}
if(d1>d2)
{
swap(d1,d2);
for(int i=;i<=;i++)swap(a[i],b[i]);
}
int ans=d2-d1;
t1=up(b,ans);
for(int i=;i<=;i++)b[i]=t1.a[i];
int l=,r=d1,res;
while(l<=r)
{
int mid=(l+r)>>;
if(up(a,mid)!=up(b,mid))l=mid+;
else r=mid-,res=mid;
}
printf("YES\n");
printf("%d",ans+*res);
return ;
}
  

【LCA】bzoj 2144:跳跳棋的更多相关文章

  1. [BZOJ 2144]跳跳棋

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

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

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

  3. 【BZOJ 2144】 2144: 跳跳棋 (倍增LCA)

    2144: 跳跳棋 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 642  Solved: 307 Description 跳跳棋是在一条数轴上进行的 ...

  4. 【bzoj2144】跳跳棋

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. MyBatis(3.2.3) - Configuring MyBatis using XML, typeAliases

    In the SQL Mapper configuration file, we need to give the fully qualified name of the JavaBeans for ...

  2. .NET的JSNO 序列化跟反序列化

    由于本人最近在写webservice,之前一直都同通过AJAX,在服务端处理业务,但是最近需要写一些接口给其他人用,需要使用jsno的序列化与反序列化,什么是jsno就不多说,jsno的好处也不多说, ...

  3. Cocos开发中性能优化工具介绍之使用Windows任务管理器

    说到Windows平台,我们很快就想到了Visual Studio 2012,然而Visual Studio 2012在这方面没有很好的工具.如果我们只是想知道大体上内存.CPU等在某一事件前后变化情 ...

  4. contentMode各种样式展示

    我们用图片来展示下contentMode的各种样式. 原图size为1155 * 715imageView的size为335 * 607 一.UIViewContentModeScaleToFill ...

  5. Objective-C 【完整OC项目-购票系统-系统分析-代码实现】

    电影院买票系统/演唱会买票系统 需求分析: 首先我们进入系统,然后会选择买电影票还是买演唱会票,所以这牵扯两个系统的合成.但是我们知道都是买票系统,所以我们可以先创建一个类,属于购买电影票和演唱会的票 ...

  6. CSS的浮动和清除

    CSS浮动和清除 什么是浮动? 在实现效果上,让元素浮起来(飘起来),动起来(向左或向右移动) 浮动本质:就是将两个块元素同存一行. float 取值:主要是对浮动的方向进行控制 left:让元素向左 ...

  7. 实现android支持多线程断点续传下载器功能

    多线程断点下载流程图: 多线程断点续传下载原理介绍: 在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度手机端下载数据时难免会出现无信号断线.电量不足等情况,所以需要断点续传功能根据下 ...

  8. plupload 限制上传数量 只能选择一张图片上传

    var files=[];var errors=[];            var chunk=<%=request.getParameter("chunk")%>; ...

  9. 【Winform】 Enum逆向解析

    将字符串转换成Enum类型 Enum.Parse:将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象.   名称 说明   Parse(Type, String) 将一个或多个枚举常数 ...

  10. javascript 面向对象技术

    面向对象术语 对象 ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值.对象或函数”.严格来说,这意味着对象是无特定顺序的值的数组. 尽管 ECMAScript 如 ...