bzoj1659: [Usaco2006 Mar]Lights Out 關燈
阿新 • • 發佈:2018-12-07
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 41111111111
1101
Sample Output
51
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;View Code6 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; 15for(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 }