8469 特殊密碼鎖

2021-08-18 02:47:39 字數 1346 閱讀 4512

總時間限制: 

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 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左...