题目传送门


题目描述

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

  (BZOJ废话总是不少)

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


输入格式

一个整数K。


输出格式

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


样例

样例输入:

3

样例输出:

8 00010111


数据范围与提示

得到的8个01串分别是000、001、010、101、011、111、110和100。注意前后是相邻的。长度为3的二进制串总共只有8种,所以M=8一定是可能的最大值。
对于全部测试点,2≤K≤11。


题意解释

一开始没有看懂题,在那里打表找规律……

语文不好是硬伤,得语文者得OI……

好吧,这道题就是说,让你找一个尽可能长的01环,让这个环不管从哪里开始,连续K位都不一样,要求找一个字典序尽可能小的。


题解

显然,长度为K的不同的01串共有${2}^{K}$个,那么第一问就完美解决了,直接输出${2}^{K}$就好了。
现在来考虑第二问,不要被其它题解所迷惑,别想的太复杂,好多人都说这道题是一个欧拉回路,不得不承认的确是的,但是你只要会爆搜就可以了。
要求字典序最小,所以前k位肯定是K个0。
然后看第K+1位,因为前面已经有K个连续的0了,所以这一位一定为1。
开始爆搜,每一次都枚举,先枚举0,再枚举1,用一个vis数组存储当前位的前K-1位和当前位的枚举值合在一起有没有出现过,将每一位压入栈,进行剪枝,搜到头即为答案(先是0后是1,保证了字典序最小)。
最后暴力弹栈输出结果。
然后说一些其他的:
A掉之后,旁边一个大佬跟我说,有规律,然后我在那里找了2个小时,没找出来,然后他跟我说,逗你玩呢……
但是还是有一些发现的,让我列举一下:
  $\alpha$.试图把每K位断开,发现从第2组到第k组第一位都为1,剩下的K-1位按字典序从K个0开始。
  $\beta$.最后的K个数都由1组成,那么第倒数K+1位数肯定是0,利用这个规律,我们可以完美解决最后一位和第一位连在一起之后代码实现较为困难的问题(其实就是我手懒)。
因为数据范围较小,所以可以打表。
当然,考试的时候建议进行打表,因为本地评测没有O2,而恰恰这道题的网站评测使用了O2,导致本地和网站评测输出不一样,疯狂WA。
需要注意的就是,评测环境为非O2的情况下,bool类型函数如果没有返回值自动返回0,而评测环境为O2的情况下返回值则为1。

代码时刻

#include<bits/stdc++.h>
int k;
bool vis[5000];//记录当前情况有没有出现过
int flag,flag1,flag2,top;//分别记录答案长度,还有几个0,还有几个1,当前长度
bool ans[5000];//记录答案
int dfs(int x,int y)
{
if(x>(1<<k))return 1;
if(!vis[((y&flag)<<1)]&&flag1)//枚举0的情况
{
flag1--;
vis[((y&flag)<<1)]=1;
if(dfs(x+1,((y&flag)<<1))){ans[++top]=0;return 1;}
flag1++;
vis[((y&flag)<<1)]=0;
}
if(!vis[(((y&flag)<<1)|1)]&&flag2)//枚举1的情况
{
flag2--;
vis[(((y&flag)<<1)|1)]=1;
if(dfs(x+1,(((y&flag)<<1)|1))){ans[++top]=1;return 1;}
flag2++;
vis[(((y&flag)<<1)|1)]=0;
}
return 0;
}
int main()
{
scanf("%d",&k);
switch(k)//第1问和前k+1位直接输出
{
case 2 :printf("4 001");break;
case 3 :printf("8 0001");break;
case 4 :printf("16 00001");break;
case 5 :printf("32 000001");break;
case 6 :printf("64 0000001");break;
case 7 :printf("128 00000001");break;
case 8 :printf("256 000000001");break;
case 9 :printf("512 0000000001");break;
case 10:printf("1024 00000000001");break;
case 11:printf("2048 000000000001");break;
}
flag=1<<(k-1);
flag--;
flag1=1<<(k-1);
flag1-=k;
flag2=flag;
vis[0]=vis[1]=1;//标记两种情况已经出现过了
dfs(k+2,1);
for(int i=top;i;i--)printf("%d",ans[i]);//输出
return 0;
}

rp++

[BZOJ3033]:太鼓达人(爆搜)的更多相关文章

  1. BZOJ3033 太鼓达人题解

    太鼓达人 时间限制: 1 Sec  内存限制: 128 MB 题目描述 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是 ...

  2. bzoj3033: 太鼓达人 欧拉路径

    题目链接 bzoj3033: 太鼓达人 题解 对于k-1位点,k位二进制位边,将点的转移连起来 每个点的入度和出度相等并且全部是偶点 只需要在这个图中找字典序最小的欧拉回路 可以贪心地找字典序较小的边 ...

  3. BZOJ3033:太鼓达人(DFS,欧拉图)

    Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和ly ...

  4. [bzoj3033]太鼓达人 题解(搜索)

    Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和ly ...

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

    Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 524  Solved: 400[Submit][Status][Discuss] Description ...

  6. [BZOJ3033]太鼓达人|欧拉图

    Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和ly ...

  7. BZOJ3033太鼓达人——哈密顿回路/欧拉回路

    题目描述 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和lydrainbo ...

  8. BZOJ3033 太鼓达人

    3033: 太鼓达人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 690  Solved: 497[Submit][Status][Discuss] ...

  9. bzoj3033 太鼓达人——欧拉图搜索

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3033 考虑那 (1<<k) 个数,要形成答案,必然是相邻两个数间有 k-1 个重 ...

随机推荐

  1. Java 读取application.properties配置文件中配置

    实际开发中若需要读取配置文件application.properties中的配置,代码如下.例:读取配置文件中name属性配置值: 代码如下: import org.springframework.c ...

  2. Gantt与PERT图区别

    甘特图也就做进度管理图.他是一种简单的水平条形图,它以日历为基准描述项目任务,水平轴表示日历时间线,每一个线条表示一个任务,任务名称垂直的列在左边列中,图中的线条的起点和终点对应水平轴上的时间,分别表 ...

  3. Hdu 4738【tanjan求无向图的桥】割边判定定理 dfn[x] < low[y]

    题目: 曹操在长江上建立了一些点,点之间有一些边连着.如果这些点构成的无向图变成了连通图,那么曹操就无敌了.刘备为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥.但是诸葛亮把所有炸弹都带走了,只留下 ...

  4. luogu P4654 [CEOI2017]Mousetrap

    传送门 这里把终点设为根方便后续处理,那么目标就是要让老鼠走到根 首先考虑老鼠动不了的情况,这种情况下可以把从这个点到终点路径上的分支堵住,然后再疏通路径上的走过的边,可以发现这是这种情况下最优的决策 ...

  5. 定义Vue-router的动态路由,获取传过来的动态参数

    设置:在router目录下的index.js文件中,对path属性加上/:id 获取:使用router对象的params.id

  6. VM439:1 https://unidemo.dcloud.net.cn 不在以下 request 合法域名列表中,请参考

    在编写uni-app编写代码时,pc端获取数据正常,但是小程序端却出现以下的错误. 解决方法如下: 将相应的选项勾选

  7. hadoop最简伪分布式安装

    本次安装运行过程使用的是Ubuntu16.04 64位+Hadoop2.5.2+jdk1.7.0_75 Notice: Hadoop2.5.2版本默认只支持64位系统 使用的jdk可以为1.7和1.8 ...

  8. (转) Oracle SQL优化必要的全表扫描思路分析

    大多数情况下,我们需要避免SQL在查询时进行全表扫描(FTS),但是对于必须需要进行全表扫描的情况,也可以进行一些优化处理. 即使全表扫描是检索所需数据的唯一可行方法,仍然有多种方法来提升查询性能.优 ...

  9. Anaconda3安装及使用

    一.安装及环境变量配置 1.从这里下载Anaconda 2.根据提示安装即可 3.配置环境变量:%Anaconda%\Script 打开命令行,输入:conda --version,回显版本即完成安装 ...

  10. 清北学堂提高突破营游记day2

    先水了一下昨天没讲完的贪心. 然后今天讲的分治. 安利自己水的二分与三分. 二分一定要满足有序.三分适合解决单峰函数问题. 第一道题借教室.运用差分和二分查找. 三分: P1731 [NOI1999] ...