BZOJ3033 太鼓達人題解

2022-05-10 06:46:42 字數 1465 閱讀 8566

時間限制: 1 sec  記憶體限制: 128 mb

鼓的主要元件是m個圍成一圈的感測器。每個感測器都有開和關兩種工作狀態,分別用1和0表示。顯然,從不同的位置出發沿順時針方向連續檢查k個感測器可以得到m個長度為k的01串。vani知道這m個01串應該是互不相同的。而且鼓的設計很精密,m會取到可能的最大值。現在vani已經了解到了k的值,他希望你求出m的值,並給出字典序最小的感測器排布方案。

乙個整數k。

乙個整數m和乙個二進位制串,由乙個空格分隔。表示可能的最大的m,以及字典序最小的排布方案,字元0表示關,1表示開。你輸出的串的第乙個字和最後乙個字是相鄰的。

3

8 00010111

得到的8個01串分別是000、001、010、101、011、111、110和100。注意前後是相鄰的。長度為3的二進位制串總共只有8種,所以m = 8一定是可能的最大值。

對於全部測試點,2≤k≤11。

這道題首先普通的暴力誰都會,然而我們要先注意到乙個事情,為什麼這麼暴力一定是正確的,我們可以注意到,乙個01串只能轉移成兩個01串,也只能由兩個01串轉移回來,所以他一定是乙個尤拉圖,也就一定有尤拉迴路,所以這一定是正確的。

然後,打乙個優美的爆搜就可以過啦。

借自[bzoj3033]太鼓達人(尤拉圖+dfs)。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include

9 #include10

using

namespace

std;

11int

k,n;

12int b[3000

];13

bool fw[3000

];14

bool ff[3000

];15

void dfs(int wz,int

js)26

if(ff[ans])

2730 ff[ans]=1;31

}32for(int i=1;i<=n;i++)

33 printf("%d"

,b[i]);

34 exit(0

);35}36

int sum=0

;37 b[wz]=0;38

for(int i=wz-k+1;i<=wz;i++)

3942

if(!fw[sum])

4349 b[wz]=1

;50 sum=0;51

for(int i=wz-k+1;i<=wz;i++)

52 sum=sum*2+b[i];

53if(!fw[sum])

5459 b[wz]=0;60

}61intmain()

view code

BZOJ3033 太鼓達人

標籤 尤拉圖,尤拉迴路 description 鼓的主要元件是m個圍成一圈的感測器。每個感測器都有開和關兩種工作狀態,分別用1和0表示。顯然,從不同的位置出發沿順時針方向連續檢查k個感測器可以得到m個長度為k的01串。vani知道這m個01串應該是互不相同的。而且鼓的設計很精密,m會取到可能的最大值...

刷題 BZOJ 3033 太鼓達人

鼓的主要元件是m個圍成一圈的感測器。每個感測器都有開和關兩種工作狀態,分別用1和0表示。顯然,從不同的位置出發沿順時針方向連續檢查k個感測器可以得到m個長度為k的01串。vani知道這m個01串應該是互不相同的。而且鼓的設計很精密,m會取到可能的最大值。現在vani已經了解到了k的值,他希望你求出m...

bzoj 3033 太鼓達人 尤拉迴路

題意 長m的01環,每個長k的子串都是不同的01串。給出k,求最大的m以及字典序最小的方案。m 2 k 可以把k 1位01串看成點,k位01串就是邊,滿足尤拉迴路的條件。然後求字典序最小的尤拉迴路就行了,優先走字典序小的邊 include include include include includ...