每日一題之 hiho1182 尤拉路三

2021-08-25 14:35:35 字數 2770 閱讀 6662

描述

小hi和小ho破解了一道又一道難題,終於來到了最後一關。只要開啟眼前的寶箱就可以通關這個遊戲了。

寶箱被一種奇怪的機關鎖住:

這個機關是乙個圓環,一共有2^n個區域,每個區域都可以改變顏色,在黑白兩種顏色之間切換。

小ho控制主角在周圍探索了一下,果然又發現了乙個紙片:

機關黑色的部分表示為1,白色的部分表示為0,逆時針連續n個區域表示乙個二進位制數。開啟機關的條件是合理調整圓環黑白兩種顏色的分布,使得機關能夠表示0~2^n-1所有的數字。

我嘗試了很多次,終究沒有辦法開啟,只得在此寫下機關破解之法。

——by 無名的冒險者

小ho:這什麼意思啊?

小hi:我給你舉個例子,假如n=3,我們通過順時針轉動,可以使得正下方的3個區域表示為:

因為黑色表示為1,白色表示為0。則上面三個狀態分別對應了二進位制(001),(010),(101)

每轉動乙個區域,可以得到乙個新的數字。一共可以轉動2^n次,也就是2^n個數字。我們要調整黑白區域的位置,使得這2^n個數字恰好是0~2^n-1

小ho:我懂了。若n=2,則將環上的黑白色塊調整為」黑黑白白」,對應了」1100」。依次是」11」,」10」,」00」,」01」四個數字,正好是0~3。那麼這個」黑黑白白」就可以開啟機關了咯?

小hi:我想應該是的。

小ho:好像不是很難的樣子,我來試試!

輸入 第1行:1個正整數,n。1≤n≤15

輸出 第1行:1個長度為2^n的01串,表示一種符合要求的分布方案

樣例輸入

3 樣例輸出

00010111

思路:小ho:啊啊啊啊啊,搞不定啊!

小hi:怎麼又是這樣,你怎麼做的?

小ho:是這樣的,每次轉動乙個區域不是相當於原來數字去掉最左邊一位,並在最後加上1或者0麼。於是我考慮對於」xyyy」,它轉動之後可以變成」yyy0」或者」yyy1」。我就將所有的數字0~2^n-1看作2^n個點,連線所有的(「xyyy」,」yyy0」),(「xyyy」,」yyy1」)。比如當n=3時,我得到了這樣乙個圖:

我要做的就是找一條路徑,從乙個點出發,走過所有的點後,再回到起點。但是我發現好像很難的樣子。

小hi:那當然了。你這樣構造出來的路徑叫做哈密頓迴路,不是那麼容易可以求解的。

小ho:哎??那我應該怎麼做。

小hi:其實你的想法是沒問題的,但是需要進行一下變換。在你的構圖中我們是用點來表示數字,所以需要經過每乙個點。如果我們用邊來表示每乙個數字呢?

小ho:怎麼用邊表示數字?

小hi:其實也很簡單,比如說數字」10011」,分別刪掉它第乙個數字和最後乙個數字,得到」1001」,」0011」。然後我們連線一條從」1001」到」0011」的有向邊,表示數字」10011」。則我們可以得到構圖的方法:

對於n,我們構造乙個包含2^(n-1)個點和2^n條邊的圖,點的編號從0到2^(n-1)-1。編號為i的點表示數字i。對於任意兩個點,如果點i,點j滿足點i的後n-2個數字和點j的前n-2個數字相同,則我們連線有向邊(i,j)。而邊(i,j)表示了數字((i << 1)+(j & 1))。比如對於n=3的時候,我們可以得到:

可以很容易證明對於任意不同邊(i,j),其表示的數字一定不同。

小ho:這樣構圖話,只要找到一條尤拉迴路就可以了。但是一定會有尤拉迴路麼?

小hi:當然能了,對於有向圖,其存在尤拉路的條件是,至多有兩個點的入度不等於出度,且這兩個點滿足:其中乙個點入度比出度多1,另乙個點出度比入度多1。

若所有點的入度都等於出度,則一定存在尤拉迴路。這可以通過和無向圖尤拉路同樣的方法進行構造證明。

而我們構造的圖,由構造方法可以知道對於任意乙個點,其入度一定為2,出度一定為2。所以它必定存在尤拉迴路。

在有向圖中找尤拉路的方法,也仍然可以使用fleury演算法。寫成偽**的話:

dfs(u):

while (以u為起點,且未被刪除的邊e(u,v))

刪除邊e(u,v)

dfs(v)

endpathsize ← pathsize + 1

path[ pathsize ] ← u

但是,有一點要注意,在使用fleury演算法計算有向圖的尤拉路時,我們需要將path倒序輸出才能得到正確的路徑。

小ho:那找到尤拉迴路之後呢?

小hi:找到尤拉迴路之後只要對該條尤拉迴路進行拼接就可以得到我們目標的圓盤狀態了。

#include 

using

namespace

std;

const

int maxn = 1

<<15;

vector

int,int>>e[maxn];

void dfs(int u)

cout

<< (u&1);

}int main()

); }

e[0][0].second = 1;

dfs(0);

return

0;}

hiho 1182 尤拉路 三

小ho 是這樣的,每次轉動乙個區域不是相當於原來數字去掉最左邊一位,並在最後加上1或者0麼。於是我考慮對於 xyyy 它轉動之後可以變成 yyy0 或者 yyy1 我就將所有的數字0 2 n 1看作2 n個點,連線所有的 xyyy yyy0 xyyy yyy1 比如當n 3時,我得到了這樣乙個圖 我...

每日一題之 hiho1176 尤拉迴路的判定

描述 小hi和小ho最近在玩乙個解密類的遊戲,他們需要控制角色在一片原始叢林裡面探險,收集道具,並找到最後的寶藏。現在他們控制的角色來到了乙個很大的湖邊。湖上有n個小島 編號1.n 以及連線小島的m座木橋。每座木橋上各有乙個寶箱,裡面似乎裝著什麼道具。湖邊還有乙個船伕,船伕告訴主角。他可以載著主角到...

每日一題之 hiho1744 hohahola

描述 有一種叫作hohahola的飲料,售價是x元一瓶。小hi非常喜歡這種飲料,但是他現在身無分文。不過小hi有n張優惠券,買hohahola時每瓶最多使用一張優惠券,可以使該瓶 減少y元。y x 同時優惠券可以 小hi每 一張優惠券可以獲得z元。請你幫小hi計算通過 若干優惠券,他最多可以買多少瓶...