洛谷P1852 跳跳棋

2022-05-06 19:54:26 字數 882 閱讀 5909

將三顆棋子看作三元組 \((x,y,z)\ x,得其能轉移到的狀態有:

\[\large\begin

&(2x-y,x,z) \\

&(x,z,2z-y) \\

&(x,2y-z,y)\ (y-x>z-y) \\

&(y,2y-x,z)\ (y-x

後兩個轉移只會滿足其中乙個,那麼將中間棋子向兩邊跳看作左右兒子,兩邊棋子向中間跳看作父親,根節點為滿足 \(y-x=z-y\) 的狀態,那麼每個狀態都唯一對應一棵二叉樹。

到樹上的 \(lca\) 即為最小步數,可以通過除來加快跳父親的過程,然後二分找 \(lca\) 即可。

#include#define inf 1000000000

using namespace std;

templateinline void read(t &x)

while(isdigit(c))

if(flag)x=-x;

}int dep;

struct node

; sort(a,a+3),x=a[0],y=a[1],z=a[2];

}}s,t;

bool operator == (const node &a,const node &b)

node find(node p,int d,int goal)

if(d1>d2)

,d+v,goal);

}int v=min(d2/d1-(d2%d1==0),goal-d);

return find((node),d+v,goal);

}int calc()

return abs(d1-d2)+dis*2;

}int main()

P1497 洛谷 P1852跳跳棋

標籤 空格分隔 資訊 圖論 二分 洛谷 考題,看到就覺得是不可能寫出來的那種,於是打了個bfs直接走人。考完之後聽呂大佬講過之後覺得此題可謂絕妙啊 屁顛屁顛地跑去寫之後才發現思路出來了 也並不好些。題面 看到覺得和倒油很像,一看資料範圍嚇死人,109109 搜尋不可能了 看著和log有關,仔細分析一...

洛谷 P1852 國家集訓隊 跳跳棋

跳跳棋是在一條數軸上進行的。棋子只能擺在整點上。每個點不能擺超過乙個棋子。我們用跳跳棋來做乙個簡單的遊戲 棋盤上有3顆棋子,分別在a,b,c這三個位置。我們要通過最少的跳動把他們的位置移動成x,y,z。棋子是沒有區別的 跳動的規則很簡單,任意選一顆棋子,對一顆中軸棋子跳動。跳動後兩顆棋子距離不變。一...

P1852 國家集訓隊 跳跳棋

原 奇怪的字串 請前往 p2543 跳跳棋是在一條數軸上進行的。棋子只能擺在整點上。每個點不能擺超過乙個棋子。我們用跳跳棋來做乙個簡單的遊戲 棋盤上有3顆棋子,分別在a,b,c這三個位置。我們要通過最少的跳動把他們的位置移動成x,y,z。棋子是沒有區別的 跳動的規則很簡單,任意選一顆棋子,對一顆中軸...