zoukankan      html  css  js  c++  java
  • 【bzoj3033】太鼓达人 DFS欧拉图

    题目描述

    给出一个整数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("
    ");
    	return 0;
    }
    

     

  • 相关阅读:
    jq 的简单循环
    简单的下拉菜单
    jQ事件
    图片移动
    选中效果
    js 时间
    简单的密码验证
    DOM 的简介 和一些方法
    Java编程思想笔记
    Java并发笔记(二)
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/7755304.html
Copyright © 2011-2022 走看看