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,注意字典序。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int n,m,b[10],st[55],c[55],d[55],qwq,ans=1e9;
 6 char q[55];
 7 bool dfs(int x,int p,int t){
 8     if(p>ans||t>qwq) return 0;
 9     if(x>n-m+1){
10         for(int i=x;i<=n;++i) t+=c[i];
11         if(p>ans||t>qwq) return 0;
12         for(int i=1;i<=p;++i) st[i]=d[i];
13         ans=p; return 1;
14     }int tmp=0;
15     for(int i=x;i<=x+m-1;++i) c[i]^=b[i-x+1];
16     d[p+1]=x;
17     tmp|=dfs(x+1,p+1,t+c[x]);
18     d[p+1]=0;
19     for(int i=x;i<=x+m-1;++i) c[i]^=b[i-x+1];
20     tmp|=dfs(x+1,p,t+c[x]);
21     return tmp;
22 }
23 int main(){
24     scanf("%d%d",&n,&m);
25     scanf("%s",q+1);
26     for(int i=1;i<=n;++i) c[i]=q[i]-48;
27     scanf("%s",q+1);
28     for(int i=1;i<=m;++i) b[i]=q[i]-48;
29     for(qwq=0;qwq<=n;++qwq)
30         if(dfs(1,0,0)) break;
31     printf("%d\n",ans);
32     for(int i=1;i<=ans;++i) printf("%d\n",st[i]);
33     return 0;
34 }
View Code

猜你喜欢

转载自www.cnblogs.com/kafuuchino/p/10085593.html