【bzoj3033】太鼓达人 DFS欧拉图
2017-10-30 16:59
288 查看
题目描述
给出一个整数K,求一个最大的M,使得存在一个每个位置都是0或1的圈,圈上所有连续K位构成的二进制数两两不同。输出最大的M以及这种情况下字典序最小的方案。
输入
一个整数K。
输出
一个整数M和一个二进制串,由一个空格分隔。表示可能的最大的M,以及字典序最小的排布方案,字符0表示关,1表示开。你输出的串的第一个字和最后一个字是相邻的。
样例输入
3
样例输出
8 00010111
题解
DFS欧拉图
简单学了一下深搜欧拉图,感觉复杂度好玄学啊。。
帖一发 黄学长题解
把每个K-1位数看作点,添加1个字符看作边,那么就是求这个图的欧拉回路,直接爆搜即可。
时间复杂度$O(2^k)$
给出一个整数K,求一个最大的M,使得存在一个每个位置都是0或1的圈,圈上所有连续K位构成的二进制数两两不同。输出最大的M以及这种情况下字典序最小的方案。
输入
一个整数K。
输出
一个整数M和一个二进制串,由一个空格分隔。表示可能的最大的M,以及字典序最小的排布方案,字符0表示关,1表示开。你输出的串的第一个字和最后一个字是相邻的。
样例输入
3
样例输出
8 00010111
题解
DFS欧拉图
简单学了一下深搜欧拉图,感觉复杂度好玄学啊。。
帖一发 黄学长题解
把每个K-1位数看作点,添加1个字符看作边,那么就是求这个图的欧拉回路,直接爆搜即可。
时间复杂度$O(2^k)$
#include <cstdio> int n , m , vis[2050] , ans[2050]; bool dfs(int x , int k) { if(vis[x]) return 0; if(k == m) return 1; ans[k] = x & 1 , vis[x] = 1; if(dfs((x << 1) & (m - 1) , k + 1)) return 1; if(dfs((x << 1 | 1) & (m - 1) , k + 1)) return 1; vis[x] = 0; return 0; } int main() { int i; scanf("%d" , &n) , m = 1 << n; printf("%d " , m); dfs(0 , 1); for(i = 1 ; i < n ; i ++ ) printf("0"); for(i = 1 ; i <= m - n + 1 ; i ++ ) printf("%d" , ans[i]); printf("\n"); return 0; }
相关文章推荐
- [BZOJ3033]太鼓达人|欧拉图
- BZOJ 3033 太鼓达人(DFS+欧拉回路)
- [BZOJ3033]太鼓达人(欧拉图+dfs)
- 3033: 太鼓达人 欧拉图+暴力
- bzoj 3033: 太鼓达人 欧拉图+dfs
- BZOJ-3033 太鼓达人
- bzoj 3033: 太鼓达人 (欧拉图+dfs)
- 【BZOJ3033】太鼓达人 暴力+欧拉回路
- bzoj 3033: 太鼓达人 [欧拉回路]
- bzoj 1688: [Usaco2005 Open]Disease Manangement 疾病管理 dfs
- 【dfs】bzoj3563 DZY Loves Chinese
- bzoj3990 [SDOI2015]排序 dfs
- 【bzoj1574/Usaco2009 Jan】地震损坏Damage——dfs
- 【BZOJ】1024: [SCOI2009]生日快乐(dfs)
- bzoj 1024: [SCOI2009]生日快乐(暴力dfs枚举所有情况)
- bzoj 1016: [JSOI2008]最小生成树计数【dfs+克鲁斯卡尔】
- bzoj 1619: [Usaco2008 Nov]Guarding the Farm 保卫牧场(DFS)
- 【BZOJ-1060】时态同步 树形DP (DFS爆搜)
- 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序
- bzoj 1082: [SCOI2005]栅栏【二分+dfs】