【BZOJ 2144】 2144: 跳跳棋 (倍增LCA)
2144: 跳跳棋
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 642 Solved: 307Description
跳跳棋是在一条数轴上进行的。棋子只能摆在整点上。每个点不能摆超过一个棋子。我们用跳跳棋来做一个简单的游戏:棋盘上有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 5Sample Output
YES
2【范围】
100% 绝对值不超过10^9HINT
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)的更多相关文章
- bzoj 2144: 跳跳棋——倍增/二分
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...
- 【洛谷】1852:[国家集训队]跳跳棋【LCA】【倍增?】
P1852 [国家集训队]跳跳棋 题目背景 原<奇怪的字符串>请前往 P2543 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个 ...
- BZOJ2144 跳跳棋[建模+LCA]
思维题,思路比较神仙. 个人思路过程:个人只想到了只要中间棋子开始向外跳了,以后就不应该向内跳了,这样很蠢.所以应该要么先向内跳一会,要么直接开始中间的向外跳.不知道怎么处理,就卡住了. 20pts: ...
- 【LCA】bzoj 2144:跳跳棋
2144: 跳跳棋 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 248 Solved: 121[Submit][Status][Discuss] ...
- [BZOJ 2144]跳跳棋
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...
- BZOJ2144跳跳棋——LCA+二分
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的 游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
- 跳跳棋——二分+建模LCA
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
- 不一样的LCA——luoguP1852跳跳棋
洛谷端题目链接 loj端题目链接 题目大意: 在一条数轴上进行跳跳棋游戏.棋子只能摆在整点上.每个点不能摆超过一个棋子.用跳跳棋完成:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动 ...
- P1852 跳跳棋 [LCA思想+二分答案]
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有\(3\)颗棋子,分别在\(a,b,c\)这三个位置.我们要通过最少的跳动 ...
随机推荐
- SSM框架整合遇到的问题
1.Maven中Dubbo集成spring2.5以上版本 项目中dubbo集成spring4.x,配置pom时需要注意排除spring的依赖,我这里用的是tomcat,所以把jboss也排除了: &l ...
- MySQL性能优化之道
1.in和not in子查询优化 not in 是不能命中索引的,所以以下子查询性能很低. 如果是确定且有限的集合时,可以使用.如 IN (0,1,2). 用 exists或 notexists代替 ...
- C#为何不推荐在构造函数中访问虚成员
如果在一个类中定义了虚属性或者虚方法,又在构造函数中访问了这个虚属性或方法,此时VisualStudio是不会给出警告,并且编译也没有问题,但是如果安装了Resharper插件则会给出警告提示:&qu ...
- 源自人脑的神奇算法 -- 读《How to make your own neural network》有感
最近读到了一本很好的关于机器学习-深度学习的书值得推荐下并特意做了这个学习总结. 为什么推荐 在我认为好书(计算机类)的评判有几个标准: 试图以通俗的语言阐述,并在引入任何新概念的时候都讲述来龙去脉, ...
- HDU 1034 Candy Sharing Game (模拟)
题目链接 Problem Description A number of students sit in a circle facing their teacher in the center. Ea ...
- scrapy爬虫框架介绍
一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...
- 项目记录 -- config2html 理解
html 代码: <table width=1280 border=0 cellspacing=1 cellpadding=1> <tr id=tblhdr> <td&g ...
- 无key值的json数组解析
[ [ { "cartId": 9223, "factoryId": 143, ...
- python 之ConfigParser模块学习
1.1 读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -options(section) 得到该secti ...
- 打开exls表格时报‘向程序发送命令是出现问题’的错误的解决方法
1.问题现象 打开表格文件时系统报如下错误 2.解决方法 1)按照如下方法找到excel选项,点击进入 2)找到‘忽略使用动态数据交换(DDE)的其它应用程序(O)',去掉复选框种的勾,点击确定,重新 ...
写一个程序,首先判断是否可以完成任务。如果可以,输出最少需要的跳动次数。