前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BZOJ3033: 太鼓达人(欧拉回路)

BZOJ3033: 太鼓达人(欧拉回路)

作者头像
attack
发布2018-10-18 11:04:55
4670
发布2018-10-18 11:04:55
举报

题意

题目链接

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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意
  • Sol
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档