鼓的主要元件是m個圍成一圈的感測器。每個感測器都有開和關兩種工作狀態,分別用1和0表示。顯然,從不同的位置出發沿順時針方向連續檢查k個感測器可以得到m個長度為k的01串。vani知道這m個01串應該是互不相同的。而且鼓的設計很精密,m會取到可能的最大值。現在vani已經了解到了k的值,他希望你求出m的值,並給出字典序最小的感測器排布方案。
乙個整數k。
乙個整數m和乙個二進位制串,由乙個空格分隔。表示可能的最大的m,以及字典序最小的排布方案,字元0表示關,1表示開。你輸出的串的第乙個字和最後乙個字是相鄰的。
8 00010111
得到的8個01串分別是000、001、010、101、011、111、110和100。注意前後是相鄰的。長度為3的二進位制串總共只有8種,所以m = 8一定是可能的最大值。
對於全部測試點,2≤k≤11。
樣例解釋裡就把第一問的答案提示出來了。。。
第一問就是 \(2^k\)
對於第二問,我到現在還是覺得很玄學。網上的做法是這樣的,將每種 \(k\) 位的二進位制數看做點,\(u\) 連向 \(v\) 當且僅當 \(u\) 的後 \(k-1\) 位與 \(v\) 的前 \(k-1\) 位相同,即每到乙個點,就是在數列的後面加一位0/1
最後就是遍歷完所有點的最小字典序的方案,爆搜就可以了,我也不知道為什麼那麼快,網上都是用尤拉圖去說明的,但是我不會。。。
#include#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int maxn=2500+10;
int k,n,ans[maxn],flag,vis[maxn],nxt;
templateinline void read(t &x)
templateinline void write(t x,char ch='\0')
templateinline void chkmin(t &x,t y)
templateinline t min(t x,t y)
inline void dfs(int st,int x,int p)
if(!vis[nxt=((st&((1
}int main()
BZOJ3033 太鼓達人
標籤 尤拉圖,尤拉迴路 description 鼓的主要元件是m個圍成一圈的感測器。每個感測器都有開和關兩種工作狀態,分別用1和0表示。顯然,從不同的位置出發沿順時針方向連續檢查k個感測器可以得到m個長度為k的01串。vani知道這m個01串應該是互不相同的。而且鼓的設計很精密,m會取到可能的最大值...
BZOJ3033 太鼓達人題解
時間限制 1 sec 記憶體限制 128 mb 鼓的主要元件是m個圍成一圈的感測器。每個感測器都有開和關兩種工作狀態,分別用1和0表示。顯然,從不同的位置出發沿順時針方向連續檢查k個感測器可以得到m個長度為k的01串。vani知道這m個01串應該是互不相同的。而且鼓的設計很精密,m會取到可能的最大值...
bzoj 3033 太鼓達人 尤拉迴路
題意 長m的01環,每個長k的子串都是不同的01串。給出k,求最大的m以及字典序最小的方案。m 2 k 可以把k 1位01串看成點,k位01串就是邊,滿足尤拉迴路的條件。然後求字典序最小的尤拉迴路就行了,優先走字典序小的邊 include include include include includ...