JZOJ.3383 太鼓达人

Special!!!

虽然本题很简单,但这道题重燃了我对信息学的信心,这题非常的有意义,所以我要积累下来,并将方法分享给大家。

Problem

Description

七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行。这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk、Poet_shy和lydrainbowcat拯救出来的的applepi。看到两人对太鼓达人产生了兴趣,applepi果断闪人,于是cl拿起鼓棒准备挑战。然而即使是在普通难度下,cl的路人本性也充分地暴露了出来。一曲终了,不但没有过关,就连鼓都不灵了。Vani十分过意不去,决定帮助工作人员修鼓。
鼓的主要元件是M个围成一圈的传感器。每个传感器都有开和关两种工作状态,分别用1和0表示。显然,从不同的位置出发沿顺时针方向连续检查K个传感器可以得到M个长度为K的01串。Vani知道这M个01串应该是互不相同的。而且鼓的设计很精密,M会取到可能的最大值。现在Vani已经了解到了K的值,他希望你求出M的值,并给出字典序最小的传感器排布方案。

Input

一个整数K。

Output

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

Sample Input

3

Sample Output

8 00010111

Explanation of Sample

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

Solution

分析

一看到样例输出的第一个数,就可以想到答案第一个数一定是2^k。
本题本人方法的思想:贪心

证明我的结论

假设答案为2^k+1,则这样一滚动,如果要符合题意,那么一定出现2^k+1种不同的长度为k的二进制串,而长度为k的二进制串最多也就有2^k个,与“出现2^k+1种不同的长度为k的二进制串”矛盾,故假设不成立。所以M=2^k。
确定M之后,就要去考虑怎么构造出这个长度为2^k的二进制串。首先我们看题目要求,题目要求我们输出字典序最小的串(即前面尽量是0,后面尽量是1),且根据对拍程序(对拍程序其实是我自己打的,简单来说就是大暴力,呵呵。)或根据样例可以观察得到前k个数字一定是0.后k个数字一定是1.

具体过程

由于这题要使前面尽量是0,后面尽量是1。所以我们假设现在正在决定第i个数字是0还是1,那么就要看前面k-1个数字了。我们将前面的k-1个数字用标记数组存起来,如果前面已经出现过这k-1个数字,则第i个数字必须是1,否则是0.
特殊判断:假设前k-1个数字由1111….100..000组成(或全部是1),则将这东西标记一下。
最后直接输出我们做的二进制串即可。

Code

var _2:array[0..11] of longint;
    a:array[0..2048] of longint;
    c:array[0..2048] of boolean;
    i,j,k,l,n,m,t,ans,x1,ii:longint;
begin
    readln(k);
    _2[0]:=1;
    for i:=1 to 11 do _2[i]:=_2[i-1]*2;
    n:=_2[k];
    c[0]:=true;
    for i:=0 to k-2 do x1:=x1+_2[i];
    for i:=0 to k-2 do
    begin
        c[x1]:=true;
        x1:=x1-_2[i];
    end;
    i:=k-1;
    while i<n-1 do
    begin
        inc(i);
        x1:=x1 mod (n div 2);
        if c[x1] then
        begin
            a[i]:=1;
            x1:=x1*2+1;
        end else
        begin
            a[i]:=0;
            c[x1]:=true;
            x1:=x1*2;
        end;
    end;
    write(n,' ');
    for i:=0 to n-1 do write(a[i]);
end.

——2016.4.9 By Wzy

你可能感兴趣的:(JZOJ.3383 太鼓达人)