特殊密碼鎖,openjudge全域性題號8496,已AC
總時間限制: 1000ms 記憶體限制: 1024kB
描述
有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。
然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的一個按鈕。
當前密碼鎖狀態已知,需要解決的問題是,你至少需要按多少次按鈕,才能將密碼鎖轉變為所期望的目標狀態。
輸入
兩行,給出兩個由0、1組成的等長字串,表示當前/目標密碼鎖狀態,其中0代表凹,1代表凸。
輸出
至少需要進行的按按鈕操作次數,如果無法實現轉變,則輸出impossible。
樣例輸入
011
000
樣例輸出
1
-------------------
## 題目解析
每個按鈕只有兩種狀態,凹或者凸,一旦第一個按鈕的狀態確定,後面的按鈕狀態也隨之確定,就類似於蝴蝶效應,所以一共只有兩種情況,只需判別這兩種情況是否成立,然後取其最小的次數。如果從第三位,第四位等等開始看也一樣。
每一個按鈕都是靠後一個按鈕來確定狀態的,如果符合密碼,則後一個按鈕不動,若不符合,則後一個按鈕翻轉。我們所需做的就是讓當前按鈕之前的按鈕都符合目的密碼,當執行到最後一個按鈕時,如果最後一個按鈕如果符合目的密碼,此種方法即成立,否則不成立。
例如 011 000
第一位不動的情況:
①第一位符合,第二位不翻轉;
②第二位不符合,第三位翻轉,此時為000
③第三位符合,成立,輸出次數。
#include <iostream> #include <algorithm> #include <string> #include <cstring> using namespace std; int ncase1=1,ncase2=0;//對應第一個按鈕按與不按 string lights; string resultLights; string temp; void Flip(string &s,int i)//翻轉按鈕狀態 { int n=s[i]-'0'; if(n) s[i]='0'; else s[i]='1'; } void Pro(string &s,int len,int &n)//從第二個開關開始進行操作 { int i=1; while(i<s.length()) { if(s[i-1]!=resultLights[i-1]) { if(s[i-1]) n++; if(i>0)//前一個按鈕翻轉 Flip(s,i-1); if(i<s.length()-1)//後一個翻轉 Flip(s,i+1); Flip(s,i);//當前 } i++; } } int main() { int ok=0; cin>>lights>>resultLights; temp=lights;//先把當前狀態儲存 Flip(temp,0);//按下第一個按鈕 Flip(temp,1); Pro(temp,int(temp.length()),ncase1); Pro(lights,int(lights.length()),ncase2);//第一個按鈕沒按的情況 if(temp==resultLights) ok=1; else ncase1=1000000;//第一個按鈕按下去這種方法不符合,ncase就無限大,作廢 if(lights==resultLights) ok=1; else ncase2=1000000; int MIN=min(ncase1,ncase2); if(ok) cout<<MIN<<endl; else cout<<"impossible"<<endl; return 0; }
相關推薦
特殊密碼鎖,openjudge全域性題號8496,已AC
a:特殊密碼鎖 總時間限制: 1000ms 記憶體限制: 1024kB 描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。 然而讓
OpenJudge簡單的整數劃分問題兩種方法(DFS)(動態規劃0ms),全域性題號7215,已AC
2:簡單的整數劃分問題 總時間限制: 100ms 記憶體限制: 65536kB描述 將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=n
PAT乙級,題號1001,3n+1猜想
1.因為要把n最終砍成1,所以如果n不是1的話,要對n進行操作,所以需要一個迴圈語句(for,while) 2.判斷n的奇偶,對奇偶數有不同的處理,所以需要一個選擇語句(if,switch) #include<iostream>using namespace std; int
Freertos-事件標誌組,消息隊列,信號量,二值信號量,互斥信號量
text pri 消息隊列 解決 消息 無需 出現 任務 一個 任務間的通信和同步機制 在裸機編程時,使用全局變量的確比較方便,但是在加上 RTOS 後就是另一種情況了。 使用全局變量相比事件標誌組主要有如下三個問題: 1、使用事件標誌組可以讓 RTOS 內核有效地管理任
小白一路走來,連續刷題三年,談談我的演算法學習經驗
資料結構與演算法應該算是一個比較難的模組,從小白一路走過來,從大一連續刷過好幾年題,看過挺多書,踩過挺多坑,也漲了一些經驗,姑且在這裡分析一波對資料結構與演算法 的學習經驗,請耐心看完,相信對你會有所幫助。 對於初學者來說,我認為選擇一本合適、不錯的演算法書是非常非常重要的,從大一到現在我也看過不少的演算法書
OpenJudge 8469:特殊密碼鎖
有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。 然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的一個按鈕。 當前
陣列,題號1、
1.兩數之和 【題目】 【解答】 【分析】題目中沒有說元素能不能重複(為什麼上面的演算法是正確的)。
html中標籤a中href屬性值的兩種特殊情況,空格和井號
<a href =" "></a> 預設開啟的還是當前頁面,會重新整理一下重新開啟,會回到頁面頂部。效果相當於F5後重新載入了頁面。 <a href ="#">&l
MyBatis 和 ibatis的動態SQL語句配置符號,不相容大於號、小於號等特殊符號問題
在XML對映SQL的檔案中,很多情況下會使用到大於號、小於號等特殊符號,這時候如果不進行控制是無法編譯通過的,這時候需要用到<![CDATA[ ]]>符號進行說明,將此類符號不進行解析,還有一種解決方法就是使用轉移字元,如,案例2,其實,這個問題不止在My
列舉-OpenJudge-8469-特殊密碼鎖
8469:特殊密碼鎖 問題描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成①(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。 然而讓人頭疼的是,②當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按
不錯的遞迴題:輸入123,返回“321”。 要求必須用遞迴,不能用全域性變數,輸入必須是一個引數,必須返回字串。
題目:輸入123,返回“321”。 要求必須用遞迴,不能用全域性變數,輸入必須是一個引數,必須返回字串。 解析:每次求得最後一個數字然後加遞迴剩餘的數字(每次縮短一個長度)。注意退出的條件是隻剩2位數
openJudge 特殊密碼鎖 ACM
總時間限制:1000ms記憶體限制:1024kB 描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。 然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右
雪花演算法(snowflake) :分散式環境,生成全域性唯一的訂單號
準備 apache.commons.lang3包 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3&l
openjudge-特殊密碼鎖
描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。 然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的一
PAT DFS,BFS,Dijkstra 題號
遇到 最短路 短路徑 結果 時間 清晰 直接 今天 我們 為什麽要分類刷題: 因為刷?道算法題需要花?兩個?時甚?半天,平時我們還要上課做別的事情,你在?段時間內刷算法如果只按照順序,可能今天遇到了?道最短路徑的題?,弄了半天好不容易看懂了別?的代碼,以為??懂了,結果?
輸入一個復雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),返回結果為復制後復雜鏈表的head。(註意,輸出結果中請不要返回參數中的節點引用,否則判題程序會直接返回空)
下一個 註意 public dom next eno style clas lin /* public class RandomListNode { int label; RandomListNode next = null; Rando
【IP分析】合並信號concat,拆分總線slice
信號 com images logs 合並 這一 -1 image mage 一般都是把幾個零散的中斷信號合並成bus,連到系統中斷總線上。 比如出個GPIO[31:0]來控制bram的幾個控制信號,分配如下: GPIO[24] - clk (可以直接指定[24]這
FreeRTOS 二值信號量,互斥信號量
形象 iii 說明 reat 互斥 機制 容易 del 情況 本章節講解 FreeRTOS 任務間的同步和資源共享機制,二值信號量。 二值信號量是計數信號量的一種特殊形式,即共享資源為 1 的情況。 FreeRTOS 分別提供了二值信號量和計數信號量,其中二值信號量可以理解
不用線程池,使用Semaphore信號量同樣也可以控制Thread多線程的並行數量。
for release map new dst sta 信號量 code tar static Semaphore sem = new Semaphore(100, 100); for (int i = 0; i <1000; i++)
唯一序列號生成,自測支持高並發,不支持集群
n) 發生 for ase 數字 led efi date() trac 序列號組成:前綴 + 日期 + 尾數 比如:ZC20140806000001 總共兩個組成:一個枚舉類。一個靜態生成器。另外須要設計自己主動任務每日淩晨或其它時間重置一次