题干:
鼓的主要元件是M个围成一圈的传感器。每个传感器都有开和关两种工作状态,分别用1和0表示。显然,从不同的位置出发沿顺时针方向连续检查K个传感器可以得到M个长度为K的01串。Vani知道这M个01串应该是互不相同的。而且鼓的设计很精密,M会取到可能的最大值。现在Vani已经了解到了K的值,他希望你求出M的值,并给出字典序最小的传感器排布方案。
题解:
这道题水得我头皮发麻。。。
这道题实际上是将 k-1 位的二进制数看做点,k位的二进制数看成边,并且连接两个点的边就是将这两个点的权像这样联系起来:
好了,它对这道题没有任何帮助。。。(欧拉路只是一个每个点都有两个入度与两个出度的极特殊的图,对一笔画问题有较好效果)。
这道题就是一道比较朴素的dfs题,题干中说以每一位向后数(1<<k)-1 个数,它所构成的二进制数均唯一。我们就可以以0为起点,不断左移一位并在 加一 或 不加一 中选择,边界直接输出即可。(长度一定是 1<<k )。
Code:
1 #include<cstdio>
2 #include<cstring>
3 #include<cstdlib>
4 #define $ 111111
5 #define maxx 1<<k
6 using namespace std;
7 int m,k,n,zzyy,judge[$],up;
8 char sta[$];
9 inline void dfs(int x,int sum){
10 judge[x]=1;
11 for(register int i=0;i<=1;++i){
12 int to=((zzyy&x)<<1)+i;
13 if(to==0&&maxx==sum){
14 for(register int i=1;i<=maxx;++i)
15 if(i<=k) putchar(‘0‘);
16 else putchar(sta[i]);
17 exit(0);
18 }
19 if(!judge[to]){
20 sta[++up]=‘0‘+i;
21 dfs(to,sum+1); up--;
22 }
23 }
24 judge[x]=0;
25 }
26 signed main(){
27 scanf("%d",&k); up=k;
28 printf("%d ",maxx);
29 zzyy=(1<<(k-1))-1;
30 dfs(0,1);
31 }
原文:https://www.cnblogs.com/OI-zzyy/p/11177764.html