【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\)这三个位置.我们要通过最少的跳动 ...
随机推荐
- ③ 设计模式的艺术-03.工厂方法(Factory Method)模式
public interface Car { void run(); } public class Audi implements Car { @Override public void run() ...
- jQuery经典面试题及答案精选[转]
这两天有个面试,把这些记在这里. 问题:jQuery的美元符号$有什么作用? 回答:其实美元符号$只是”jQuery”的别名,它是jQuery的选择器,如下代码: $(document).ready( ...
- CodeForces - 1003D
Polycarp has nn coins, the value of the ii-th coin is aiai. It is guaranteed that all the values are ...
- 分享6款国内、外开源PHP轻论坛CMS程序
第一.Startbbs Startbbs,一款国产个人兴趣分享的轻论坛程序,采用PHP+MYSQL架构,目前版本是V1.1.5,之前我也 有搭建使用过功能还是比较简单的,默认风格比较让普通用户接受,这 ...
- weblogic 配置了ssl
jingyan.baidu.com/article/72ee561abfe531e16138dfb5.html http://blog.sina.com.cn/s/blog_7ffec3e201019 ...
- Deep Learning基础--机器翻译BLEU与Perplexity详解
前言 近年来,在自然语言研究领域中,评测问题越来越受到广泛的重视,可以说,评测是整个自然语言领域最核心和关键的部分.而机器翻译评价对于机器翻译的研究和发展具有重要意义:机器翻译系统的开发者可以通过评测 ...
- 【Learn】CSS定义
CSS基础语法 本文用于介绍CSS相关的知识,用于记录自己的学习笔记.由于我已经熟悉了部分的HTML,所以相关的概念也不在这里进行描述了,直接写自己的一些心得感悟. 1.CSS规则 CSS是由两个主要 ...
- Java中Enum的使用
http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html Enum有一个好处,可以使用EnumMap和EnumSet,而En ...
- 后门技术和Linux LKM Rootkit详解
2010-01-15 10:32 chinaitlab chinaitlab 字号:T | T 在这篇文章里, 我们将看到各种不同的后门技术,特别是 Linux的可装载内核模块(LKM). 我们将会发 ...
- MySQL-开发规范升级版
一.基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字节,英文1字节 (2)utf8mb4是utf8的超集,有 ...
写一个程序,首先判断是否可以完成任务。如果可以,输出最少需要的跳动次数。