【BZOJ-3033】太鼓达人 欧拉图 + 暴搜

3033: 太鼓达人

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 204  Solved: 154
[Submit][Status][Discuss]

Description

  七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行。这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk、Poet_shy和lydrainbowcat拯救出来的的applepi。看到两人对太鼓达人产生了兴趣,applepi果断闪人,于是cl拿起鼓棒准备挑战。然而即使是在普通难度下,cl的路人本性也充分地暴露了出来。一曲终了,不但没有过关,就连鼓都不灵了。Vani十分过意不去,决定帮助工作人员修鼓。

  鼓的主要元件是M个围成一圈的传感器。每个传感器都有开和关两种工作状态,分别用1和0表示。显然,从不同的位置出发沿顺时针方向连续检查K个传感器可以得到M个长度为K的01串。Vani知道这M个01串应该是互不相同的。而且鼓的设计很精密,M会取到可能的最大值。现在Vani已经了解到了K的值,他希望你求出M的值,并给出字典序最小的传感器排布方案。

Input

  一个整数K。

Output

 一个整数M和一个二进制串,由一个空格分隔。表示可能的最大的M,以及字典序最小的排布方案,字符0表示关,1表示开。你输出的串的第一个字和最后一个字是相邻的。

Sample Input

3

Sample Output

8 00010111

HINT

 得到的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,那么就符合欧拉图的判定了

那么第一问的正确性可知

因为是欧拉图,必然存在欧拉路径,那么只需要对整个图暴搜一遍答案即可,因为欧拉图,暴搜的时间复杂度实际是$O(n)$的,因为几乎可以认为是一口气走到底

于是就可以1s无压力过所有点

启示:一些看似和图没太大关联的东西,应该拓宽一下思路尝试往图上靠,利用一些性质可能会发现一些不错的东西 (更好的栗子:墨墨的等式)

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,发现自己好像没怎么做过啊...

原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5615414.html