意甲冠军:

有三件  所有其他棋子可以跳  不能分开的两个跳跃  当被问及状态u为了国家v最低短跳转

思路:

对于一个状态三个棋子的位置能够设为 x y z  (小到大)

仅仅有当y-x=z-y的时候  跳的方法为两种  即  y跳过x  或  y跳过z

在上式等式不成立时  短的一边能够跳很多次  直到大小关系改变

那么这样就形成了二叉树的结构  我们将y向左右跳的状态分别作为原状态的儿子  将两边当中一个向中间跳的状态作为原状态的父亲

那么这时u和v的可达性就变成了  他们是不是同一个根  于是我们能够从u和v跳到头  推断一下

假设能跳  要跳几次呢??  这时利用LCA  方法与倍增法同样  即  u和v先爬到同一高度  再同一时候爬

爬的方法和刚才的状态向根移动同样  因为没有倍增打表  因此同一深度后我们要用二分法确定爬的高度

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<cstdlib>
#include<ctime>
#include<cmath>
using namespace std;
typedef unsigned long long LL;
#define M 1100
#define N 16 struct state {
int x[3];
void Sort() {
sort(x, x + 3);
}
int Root() {
int floor = 0;
int a1 = x[1] - x[0], a2 = x[2] - x[1];
while (a1 != a2) {
if (a1 > a2) {
int d = (a1 - 1) / a2;
floor += d;
x[2] -= d * a2;
x[1] -= d * a2;
} else {
int d = (a2 - 1) / a1;
floor += d;
x[0] += d * a1;
x[1] += d * a1;
}
Sort();
a1 = x[1] - x[0], a2 = x[2] - x[1];
}
return floor;
}
bool operator==(const state ff) const {
return (x[0] == ff.x[0]) && (x[1] == ff.x[1]) && (x[2] == ff.x[2]);
}
void GoUp(int floor) {
while (floor) {
int a1 = x[1] - x[0], a2 = x[2] - x[1];
if (a1 > a2) {
int d = (a1 - 1) / a2;
if (d > floor)
d = floor;
floor -= d;
x[2] -= d * a2;
x[1] -= d * a2;
} else {
int d = (a2 - 1) / a1;
if (d > floor)
d = floor;
floor -= d;
x[0] += d * a1;
x[1] += d * a1;
}
Sort();
}
}
} u, v, fau, fav; int main() {
int fu, fv, ans;
while (~scanf("%d%d%d%d%d%d", &u.x[0], &u.x[1], &u.x[2], &v.x[0], &v.x[1],
&v.x[2])) {
u.Sort();
v.Sort();
fau = u;
fav = v;
fu = fau.Root();
fv = fav.Root();
if (fau == fav) {
puts("YES");
if (fu > fv) {
ans = fu - fv;
u.GoUp(ans);
} else if (fv > fu) {
ans = fv - fu;
v.GoUp(ans);
} else
ans = 0;
int l = 0, r = min(fu, fv), mid, tmp;
while (l <= r) {
mid = (l + r) >> 1;
fau = u;
fav = v;
fau.GoUp(mid);
fav.GoUp(mid);
if (fau == fav) {
r = mid - 1;
tmp = mid;
} else
l = mid + 1;
}
printf("%d\n", ans + (tmp << 1));
} else
puts("NO");
}
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

HDU 3830 Checkers的更多相关文章

  1. HDU 3830 Checkers(二分+lca)

    Description Little X, Little Y and Little Z are playing checkers when Little Y is annoyed. So he wan ...

  2. 最近公共祖先(LCA)模板

    以下转自:https://www.cnblogs.com/JVxie/p/4854719.html 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖 ...

  3. Tarjan & LCA 套题题目题解

    刷题之前来几套LCA的末班 对于题目 HDU 2586 How far away 2份在线模板第一份倍增,倍增还是比较好理解的 #include <map> #include <se ...

  4. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  5. hdu图论题目分类

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  6. HDU图论题单

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  7. Tarjan LCA

    强连通 迷宫城堡 Proving Equivalences Equivalent Sets Summer Holiday Intelligence System The King's Problem ...

  8. [tarjan] hdu 3836 Equivalent Sets

    主题链接: http://acm.hdu.edu.cn/showproblem.php? pid=3836 Equivalent Sets Time Limit: 12000/4000 MS (Jav ...

  9. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

随机推荐

  1. 九度OnlineJudge之1020:最小长方形

    题目描述:     给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内.长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内. 输入:      ...

  2. 使用TWebBrowser时存在内存泄漏问题的解决方案(使用SetProcessWorkingSetSize函数,或者修改OleCtrls.pas源码解决问题)

    用TWebBrower不断打开多个网页,多某些版本的操作系统上运行一段时间后,发现占用系统内存达几百M,直到关闭程序后,占用的内存才能释放. 这个问题在网有很多讨论,比较多人的建议办法是用SetPro ...

  3. Lucene.Net 2.3.1开发介绍 —— 二、分词(一)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(一) Lucene.Net中,分词是核心库之一,当然,也可以将它独立出来.目前Lucene.Net的分词库很不完善,实际应用价值不高.唯 ...

  4. Guava学习笔记:EventBus(转)

    EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现.对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和 ...

  5. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

  6. .NET Page页面事件执行顺序,以及其作用(OnPreInit()、OnInit()等)

    以按钮事件为测试标准 1. OnPreInit //检查 IsPostBack 属性来确定是不是第一次处理该页. //创建或重新创建动态控件. //动态设置主控页. //动态设置 Theme 属性. ...

  7. Android:通知栏的使用

    非常久没有使用Android的通知功能了,今天把两年前的代码搬出来一看.发现非常多方法都废弃了,代码中各种删除线看的十分不爽.于是乎,打开Google,查看官方文档.学习最新的发送通知栏消息的方法. ...

  8. openssl之BIO系列之5---CallBack函数及其控制

    CallBack函数及其控制     ---依据openssl doc/crypto/bio/bio_set_callback.pod翻译和自己的理解写成          (作者:DragonKin ...

  9. perl 访问网站一些useragent的设置

    121.40.205.143 - - [22/Jun/2016:12:56:23 +0800] "GET /wechat/account.html HTTP/1.1" 200 34 ...

  10. Ubuntu下Chromium源码的编译

    一.失败的经历 印象中,谷歌建议Ubuntu建议版本为10.4.但是我找不到出处了,模糊的印象.不知道是不是这样? 1.Ubuntu10.4.3-desktop-amd64 + Virtual Box ...