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希望拆遷一些舊房子並在原地建立新房子來滿足這一要...