zoukankan      html  css  js  c++  java
  • BZOJ3033: 太鼓达人(欧拉回路)

    题意

    题目链接

    Sol

    第一问的答案是(2^M),因为每个位置只有(0 / 1)两种情况,最优情况下一定是每个位置代表着一个长度为(K)的字符串

    考虑相邻两个字符串之间的转化,第二个字符串可以由第一个字符串在后面加(0 / 1)转移而来,因为转移关系会形成环,所以我们只需要找一条欧拉回路即可,每次走的时候优先走编号小的边

    代码好神啊。看不懂的话可以手玩一下(n = 2)的数据

    #include<bits/stdc++.h>
    using namespace std;
    int K, Lim, vis[1 << 12], ans[1 << 12];
    int dfs(int sta, int dep) {
    
    	if(vis[sta]) return 0;
    	if(dep == Lim + 1) return 1;
    	vis[sta] = 1; ans[dep] = sta & 1;//得到该字符的最后一个元素 
    	if(dfs((sta << 1) & Lim, dep + 1)) return 1;
    	if(dfs((sta << 1 | 1) & Lim, dep + 1)) return 1;
    	vis[sta] = 0;
    	return 0;
    }
    int main() {
    	cin >> K;
    	cout << (Lim = ((1 << K) - 1)) + 1 << endl;
    	dfs(0, 1);
    	for(int i = 1; i < K; i++) putchar('0');
    	for(int i = 1; i <= Lim - K + 2; i++) printf("%d", ans[i]); 
    	return 0;
    }
    
  • 相关阅读:
    Hive学习笔记记录
    Hadoop学习笔记记录
    python学习笔记记录
    2018高级软件工程——助教总结
    Week3 第二次结对编程
    Week2 第一次结对编程
    Week1 博客作业
    最后一周总结
    阅读和提问3
    个人项目 案例分析
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/9790863.html
Copyright © 2011-2022 走看看