關於北航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 當初你是如何做出選擇計算機專業的決定的?因為身份戶籍的關關係當初比正常高考生低很...