zoukankan      html  css  js  c++  java
  • bzoj:1659: [Usaco2006 Mar]Lights Out 关灯

    Description

    奶牛们喜欢在黑暗中睡觉。每天晚上,他们的牲口棚有L(3<=L<=50)盏灯,他们想让亮着的灯尽可能的少。他们知道按钮开关的位置,但喜闻乐见的是他们并没有手指。你得到了一个长度为T(1<=T<=7)的插槽用以帮助奶牛们改变灯的状态。
     

    Input

    第一行,两个整数L和T。第二行给出一个长度为L的01串表示初始灯的状态,0表示灯是灭的,1表示灯是亮的。第三行给出一个长度为T的01串,表示你获得的插槽。

    Output

    第一行输出一个整数K,表示在满足亮着的灯最少的情况下,你要用插槽操作的次数。第二行到第K+1行,每行一个整数表示你的插槽使用的位置。
    "K最小的解,并且满足解的字典序最大(即按钮开关的位置尽可能靠后)"
     

    Sample Input

    10 4
    1111111111
    1101

    Sample Output

    5
    1
    3
    4
    6
    7

    HINT

    使用5次插槽

    1111111111  初始状态

    0010111111  对第一个位置使用插槽

    0001101111  对第三个位置使用插槽

    0000000111  对第四个位置使用插槽

    0000011101  对第六个位置使用插槽

    0000010000  对第七个位置使用插槽

    可以证明这是满足字典序最小的最优解。

     
     
    各自无脑地挂了很多发……QAQ
    因为异或操作是符合交换律的,所以完全可以从左到右枚举每个按钮要不要按(一个位置最多按一次),然后维护一下字典序……
     
    #include<cstdio>
    #include<iostream>
    using namespace std;
    
    int n,m;
    int f[51],t[51],i;
    char c[51];
    int pos[51];
    int ans[51],xp,o=50,sp=0;
    void u(){
        if(sp>o) return;
        o=sp;
        for(i=1;i<=o;i++) ans[i]=pos[i];
    }
    bool dfs(int yyt,int xx){
        if (xx>xp) return 0;
        if (sp>o) return 0;
        if (yyt>n-m+1){
            for (i=yyt;i<=n;i++) if (f[i]) xx++;
            if (xx>xp) return 0;
            u();
            return 1;
        }
        for (i=1;i<=m;i++) f[yyt+i-1]^=t[i];
        pos[++sp]=yyt;
        bool cmp=dfs(yyt+1,xx+f[yyt]);
        for (i=1;i<=m;i++) f[yyt+i-1]^=t[i];
        sp--;
        cmp|=dfs(yyt+1,xx+f[yyt]);
        return cmp;
    }
    int main(){
        scanf("%d%d",&n,&m);
        scanf("%s",c+1);for (i=1;i<=n;i++) f[i]=c[i]-48;
        scanf("%s",c+1);for (i=1;i<=m;i++) t[i]=c[i]-48;
        for (xp=0;xp<=n;xp++) if (dfs(1,0)) break;
        printf("%d
    ",o);
        for (i=1;i<=o;i++) printf("%d
    ",ans[i]);
    }
  • 相关阅读:
    Python Tkinter canvas oval原理
    ButterKnife你需要知道的点
    RecyclerView不同类型Item的展示
    PNG图片小结
    安装应用
    java.io.IOException: open failed: ENOENT (No such file or directory)open failed: EISDIR (Is a directory)
    YouTube视频插入Markdown
    Android icons集合
    vue动态绑定类样式ClassName知多少
    js正则表达式中的正向肯定预查和正向否定预查
  • 原文地址:https://www.cnblogs.com/Enceladus/p/5040110.html
Copyright © 2011-2022 走看看