總時間限制:
1000ms
記憶體限制:
1024kb
描述有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。
然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的乙個按鈕。
當前密碼鎖狀態已知,需要解決的問題是,你至少需要按多少次按鈕,才能將密碼鎖轉變為所期望的目標狀態。
輸入兩行,給出兩個由0、1組成的等長字串,表示當前/目標密碼鎖狀態,其中0代表凹,1代表凸。
輸出至少需要進行的按按鈕操作次數,如果無法實現轉變,則輸出impossible。
樣例輸入
樣例輸出011
000
1
這道題和熄燈問題很相似:
1. 同一按鈕只能按一次,不然效果會抵消;
2. 按下各個按鈕的順序對最終結果沒有影響。
所以,我們就規定從右往左一次按下需要按下的按鈕,只需要從右開始依次比較兩個 bit 是否相同,如果不相同的話我們是要按下這個按鈕還是它後面的按鈕呢?有兩種情況:
如果這個按鈕是首個按鈕,那麼按下這個按鈕就行了,因為右邊沒有其他按鈕;
如果不是,就要按下它後面的按鈕,按它的話前邊的按鈕就會變。
現在的問題是:我怎麼能夠確定這樣就是最少的次數呢?可以這樣想,對於乙個需要改變狀態的按鈕,如果我按下這個按鈕,因為這個操作還需要改變狀態的次數最少是1,因為前面對的被改反了,最多是2(如果它後面的按鈕的狀態原本也是對的)。
那如果我按下它後面的按鈕呢?最少次數是0(它後面的按鈕和後後面的按鈕的狀態原本都是反的),最多是2(它後面的按鈕和後後面的按鈕的狀態原本都是對的)。
其實也可以這樣想,我們從右往左按下按鈕的時候,如果你按下這個按鈕,那前面已經對的還要被改變,其實相當於與無用功。
所以說,最優的操作就是去改變需要改變狀態的按鈕後面的按鈕,除非這個按鈕是首個按鈕,因為它前面沒有按鈕。
最後只需要看最後一位 bit 是否相同就行了。
#include#includeusing namespace std;
const int maxn = 30;
int n;
int getbit(int n,int i)
int cnt = 0;
for(int i = 0;i < n - 1;i++)
}if(a == b) printf("%d\n",cnt);
else printf("impossible\n");
return 0;
}
8469 特殊密碼鎖
總時間限制 1000ms記憶體限制 1024kb 描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成 n 30 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的乙個...
(列舉)8469 特殊密碼鎖
問題描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成 n 30 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的乙個按鈕。當前密碼鎖狀態已知,需要解決的問題是,你至...
OpenJudge 8469 特殊密碼鎖
中國mooc網,程式設計與演算法 二 第一周作業1 總時間限制 1000ms 記憶體限制 1024kb 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成 n 30 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左...