2017級北航演算法軟院第一次演算法上機 位元手鍊

2021-09-11 02:12:23 字數 1677 閱讀 6845

關於北航oj的個人github位址

時間限制:1000ms 記憶體限制:65536kb oj編號:1413

通過率:14/28 (50.00%) 正確率:14/79 (17.72%)

題目描述

葉姐要想哥贈送一串位元手鍊,這個手鍊由0和1組成。想哥買了手鍊b,無意間得知葉姐想要同樣長度的手鍊a。想哥囊中羞澀,只能手工調整手鍊。他希望最少通過以下操作進行最少步驟把b變成a。注意:a != b

對於乙個串s:

操作1——選擇下標i,j,i != j:

·result = s[i] & s[j]

·s[i] = result & s[i]

·s[j] = result & s[j]

操作2——選擇下標i,j,i != j:

·result = s[i] | s[j]

·s[i] = result | s[i]

·s[j] = result | s[j]

操作3——選擇下標i,j,i != j:

·result = s[i] ^ s[j]

·s[i] = result ^ s[i]

·s[j] = result ^ s[j]

問想哥最少多少步能達成心願。如果想哥無法達成心願,輸出-1。

輸入第乙個數為資料組數t

接下來2t行,第2i - 1行為手鍊b,第2i行為手鍊a

輸出對於每組資料,輸出一行,最少的步驟數。特別地,如果無法達成,輸出-1。

輸入樣例

2101

0101111

1010

輸出樣例2-1

hint

t<=5;

長度<=10^6;

ac**(c++):

#include #include #include using namespace std;

int t;

string a,b;

int main()

{ for(scanf("%d",&t);t--;){

cin>>b>>a;

int len=a.size();

int cnt1=0,cnt0=0;

int b1=0,b0=0;

for(int i=0;i思路:

這種題目,思路就是實體化變數。就是把題干裡的s[i],s[j]用乙個數對來實體化,這道題中就是數對(1,0)。經過實體化後可以發現且運算就是把1變0,把0變0;或運算就是把0變1,把1變1;異或運算就是把1變0,把0變1.這三種運算中異或運算是比較便捷的,因為只需要一次運算就能換兩個數,另兩個運算只能換1個數。所以要盡快轉換,就要多用異或運算。

具體操作時,就是同時遍歷兩組字串,遇上不相同的時候就記錄,看b串中不同的是0還是1,cnt1,cnt0分別記錄b串異於a串中1和0的個數。如果cnt0= =cnt1,那麼把這些1和0用異或運算交換位置即可;若cnt0>cnt1,那麼先進行cnt1次異或運算把1變成0,0變成1,然後剩下的cnt0-cnt1個0再用或運算換成1,總的運算次數為cnt0;cnt1>cnt0的情況同理。那麼,我們就可以得到乙個結論,如果可以實現轉換,那麼若cnt1!=cnt0,最少的轉換次數為max(cnt1,cnt0),其實這個結論在cnt0= =cnt1時也是成立的。

那麼哪種情況是不可以實現轉換的呢?答案是若b為全0或者全1的情況下是無法轉換的。可以通過分別計算b串中1和0的總個數並將之與b.size()進行比較,若相等則說為全1/0串。

北航2017級演算法第一次上機 位元手鍊

位元手鍊 乙個類似於腦筋急轉彎的題目,考查模擬,貪心等知識點。通過模擬題中給出的三個操作我們可以得到一下幾個結論 如果a i a j a i a j a i a j 那麼三個操作都無效,維持原狀 操作相當於把1變為0 操作相當於把0變為1 操作i相當於交換 由以上結論我們不難得出,優先使用 一次性解...

軟工第一次作業

這是我第一次寫部落格,應該會有很多問題,請見諒,正好也藉此反思自己,督促自己。其實我高中畢業之後,腦子可以說是一片空白,沒有什麼思路的,因為好不容易熬完了3年又三年,尤其是在江蘇這種鬼地方,真的是壓力山大,所以高考結束之後到報專業之前這段時間,並沒有多做準備,最後順應了父母跟親戚的意見,於是就選擇了...

第一次軟工作業

031702446 我是林巨集海 我的愛好是活著 最近喜歡玫瑰園一樓的荔枝肉很好吃!最近在聽拉拉打雷的肉桂女孩聽了很想吃肉桂 好好學習 第一我不叫喂.閱讀思考 2.1 回想一下你初入大學時對計算機專業的暢想 2.1.1 當初你是如何做出選擇計算機專業的決定的?因為身份戶籍的關關係當初比正常高考生低很...