2011集訓隊出題 跳跳棋

2021-08-14 10:54:02 字數 1511 閱讀 7346

time limits: 1000 ms memory limits: 128000 kb

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

hint20% 輸入整數的絕對值均不超過10

40% 輸入整數的絕對值均不超過10000

100% 絕對值不超過10^9

大意如題。

啊?一看就蒙了,不會做啊。果斷上暴力

於是最後發現自己是個傻子:在中間的點往兩邊條,兩邊的點往中間跳,為互逆操作,看做一條邊。所以就是求兩個狀態的最短路徑咯!!

繼續剖析這個圖,假設三個點中間的那個往左跳到左兒子,往右跳到右兒子,根為三點等距,求兩狀態的lca!!倍增——怎麼搞啊,樹都不會建。。。誒?跳躍過程中兩點的相對距離不改變——利用這個倍增就好了。

#include

#include

#define ll long long

using namespace std;

ll a,b,c,x,y,z;

void swap(ll &a,ll &b)

ll floor(ll s,ll s1,ll s2)

}void climb(ll &s,ll &s1,ll &s2,ll fl)else

}else

if(s2>s1)else

}else

break;

}}bool com(ll s,ll s1,ll s2,ll f1,ll t,ll t1,ll t2,ll f2)

ll go(ll s,ll s1,ll s2,ll t,ll t1,ll t2)

int main()

2011集訓隊出題 happiness

高一一班的座位表是個n m的矩陣,經過乙個學期的相處,每個同學和前後左右相鄰的同學互相成為了好朋友。這學期要分文理科了,每個同學對於選擇文科與理科有著自己的喜悅值,而一對好朋友如果能同時選文科或者理科,那麼他們又將收穫一些喜悅值。作為計算機競賽教練的scp大老闆,想知道如何分配可以使得全班的喜悅值總...

2011集訓隊出題 happiness

description 高一一班的座位表是個n m的矩陣,經過乙個學期的相處,每個同學和前後左右相鄰的同學互相成為了好朋友。這學期要分文理科了,每個同學對於選擇文科與理科有著自己的喜悅值,而一對好朋友如果能同時選文科或者理科,那麼他們又將收穫一些喜悅值。作為計算機競賽教練的scp大老闆,想知道如何分...

2011集訓隊出題 拆遷隊

lanxisi帶領著他的拆遷隊來整治乙個街道。這個街道由n個舊房子組成,從左到右編號為1.n。每個舊房子i有乙個正整數的美觀度ai。lanxisi希望整個街道從左到右美觀度嚴格遞增,也就是保證ai i。但是舊的街道明顯不符合這個要求,於是lanxisi希望拆遷一些舊房子並在原地建立新房子來滿足這一要...