【BZOJ-3033】太鼓达人 欧拉图 + 暴搜
3033: 太鼓達人
Time Limit: 1 Sec??Memory Limit: 128 MBSubmit: 204??Solved: 154
[Submit][Status][Discuss]
Description
七夕祭上,Vani牽著cl的手,在明亮的燈光和歡樂的氣氛中愉快地穿行。這時,在前面忽然出現(xiàn)了一臺太鼓達人機臺,而在機臺前坐著的是剛剛被精英隊伍成員XLk、Poet_shy和lydrainbowcat拯救出來的的applepi。看到兩人對太鼓達人產(chǎn)生了興趣,applepi果斷閃人,于是cl拿起鼓棒準(zhǔn)備挑戰(zhàn)。然而即使是在普通難度下,cl的路人本性也充分地暴露了出來。一曲終了,不但沒有過關(guān),就連鼓都不靈了。Vani十分過意不去,決定幫助工作人員修鼓。
鼓的主要元件是M個圍成一圈的傳感器。每個傳感器都有開和關(guān)兩種工作狀態(tài),分別用1和0表示。顯然,從不同的位置出發(fā)沿順時針方向連續(xù)檢查K個傳感器可以得到M個長度為K的01串。Vani知道這M個01串應(yīng)該是互不相同的。而且鼓的設(shè)計很精密,M會取到可能的最大值。現(xiàn)在Vani已經(jīng)了解到了K的值,他希望你求出M的值,并給出字典序最小的傳感器排布方案。
Input
一個整數(shù)K。
Output
一個整數(shù)M和一個二進制串,由一個空格分隔。表示可能的最大的M,以及字典序最小的排布方案,字符0表示關(guān),1表示開。你輸出的串的第一個字和最后一個字是相鄰的。
Sample Input
3Sample Output
8 00010111HINT
得到的8個01串分別是000、001、010、101、011、111、110和100。注意前后是相鄰的。長度為3的二進制串總共只有8種,所以M = 8一定是可能的最大值。
對于全部測試點,2≤K≤11。
Source
Poetize2
Solution
看了一會,確信第一問為$2^{k}$但是不會證...第二問并不會搞
其實做之前是專門奔著 歐拉圖 來的QAQ
好叭,很顯然是個歐拉圖,每個階段有兩個點$0$和$1$,很顯然每個點的入讀=出度=2,那么就符合歐拉圖的判定了
那么第一問的正確性可知
因為是歐拉圖,必然存在歐拉路徑,那么只需要對整個圖暴搜一遍答案即可,因為歐拉圖,暴搜的時間復(fù)雜度實際是$O(n)$的,因為幾乎可以認(rèn)為是一口氣走到底
于是就可以1s無壓力過所有點
啟示:一些看似和圖沒太大關(guān)聯(lián)的東西,應(yīng)該拓寬一下思路嘗試往圖上靠,利用一些性質(zhì)可能會發(fā)現(xiàn)一些不錯的東西 (更好的栗子:墨墨的等式)
Code
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; int M,K,ans[1<<12]; bool visit[1<<12]; bool DFS(int x,int dep) {if (visit[x]) return 0;visit[x]=1;ans[dep]=x>>(K-1);if (dep==M) return 1;if (DFS((x<<1) & (M-1),dep+1)) return 1;if (DFS((x<<1|1) & (M-1),dep+1)) return 1;visit[x]=0;return 0; } int main() {scanf("%d",&K); printf("%d ",M=1<<K);DFS(0,1);for (int i=1; i<=M; i++) printf("%d",ans[i]);return 0; }突然想做歐拉圖的原因在于 英語必修五Unit1的某篇Reading居然講的歐拉圖TAT,發(fā)現(xiàn)自己好像沒怎么做過啊...
轉(zhuǎn)載于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5615414.html
總結(jié)
以上是生活随笔為你收集整理的【BZOJ-3033】太鼓达人 欧拉图 + 暴搜的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 修改文件名_Linux常用命
- 下一篇: 工作总结08