zoukankan      html  css  js  c++  java
  • bzoj1659: [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
     


    IDA*
    从小到大枚举亮灯的个数并dfs,注意字典序。
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,m,b[10],st[55],c[55],d[55],tk,ans=1e9;
    char q[55];
    bool dfs(int x,int p,int t){
        if(p>ans||t>tk) return 0;
        if(x>n-m+1){
            for(int i=x;i<=n;++i) t+=c[i];
            if(p>ans||t>tk) return 0;
            for(int i=1;i<=p;++i) st[i]=d[i];
            ans=p; return 1;
        }int tmp=0;
        for(int i=x;i<=x+m-1;++i) c[i]^=b[i-x+1];
        d[p+1]=x;
        tmp|=dfs(x+1,p+1,t+c[x]);
        d[p+1]=0;
        for(int i=x;i<=x+m-1;++i) c[i]^=b[i-x+1];
        tmp|=dfs(x+1,p,t+c[x]);
        return tmp;
    }
    int main(){
        scanf("%d%d",&n,&m);
        scanf("%s",q+1);
        for(int i=1;i<=n;++i) c[i]=q[i]-48;
        scanf("%s",q+1);
        for(int i=1;i<=m;++i) b[i]=q[i]-48;
        for(tk=0;tk<=n;++tk)//从小到大枚举亮灯数
            if(dfs(1,0,0)) break;
        printf("%d
    ",ans);
        for(int i=1;i<=ans;++i) printf("%d
    ",st[i]);
        return 0;
    }
  • 相关阅读:
    85--spring cloud (Ribbon-Eureka注册中心)
    85--spring cloud 入门(springcloud简介)
    84--spring cloud 入门(微服务注册中心介绍)
    83--spring cloud 入门(Eureka注册中心)
    82--JT项目20(订单模块实现/ThreadLocal本地线程变量/Quartz框架)
    81--JT项目19(商品购物车/详情/用户退出)
    80--JT项目18(Dubbo负载均衡/单点登录/注册业务)
    Ajax中post与get的区别
    Process
    Java实现CURL,与把字符串结果写到json文件
  • 原文地址:https://www.cnblogs.com/kafuuchino/p/10085593.html
Copyright © 2011-2022 走看看