P1 2017級第一次演算法上機 E 位元手鍊

2022-05-10 18:19:15 字數 2357 閱讀 6591

葉姐要想哥贈送一串位元手鍊,這個手鍊由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。

2

101

010

1111

1010

2

-1

t<=5;

長度<=10^6;
碰到這種型別,一般都要先手動模擬,尋找規律。

通過手動計算可以發現,若a[i] == a[j],則三個運算均不會造成影響;只有a[i] != a[j]時,即乙個為0乙個為1,才會造成改變。

對於&:相當與把1變成0;對於|:相當於把0變成1;對於^,相當於交換。

所以,如果原串全為0或全為1,由於a!=b,所以是無解的;否則解的個數即為max(0變成1的數量,1變成0的數量),也就是說,盡量使用^交換一次性解決兩個,無法交換了再用&或|一次修改乙個。

1

//我的版本

2 #include3 #include

4#define maxn 1000002

5int

main()623

if(ans_b0 == len || ans_b0 == 0

)27 printf("

%d\n

",max(t01,t10));28}

2930

return0;

31}3233

int max(int a,int

b)34

1

//助教的版本

2 #include3 #include4 #include5

6const

int n=1000010;7

intlen,l,r,t,sum;

8char

a[n],b[n];

910 inline int max(int a,int

b) 13

14int

main()

23for(int i=0;ii)

24if(a[i]!=b[i])

25 a[i]=='

0' ? ++l : ++r;

26 printf("

%d\n

",max(l,r));27}

28return0;

29 }

第一次上機

1 已知a,b均是整型變數,寫出將a,b兩個變數中 的值互換的程式。知識點 變數和運算子綜合 應用 2 給定乙個0 1000的整數,求各位數的和,例 如345的結果是3 4 5 12注 分解數字既可以先 除後模也可以先模後除 知識點 變數和運算子 綜合應用 3 華氏溫度和攝氏溫度互相轉換,從華氏度變...

第一次上機

1 已知a,b均是整型變數,寫出將a,b兩個變數中的值互換的程式。知識點 變數和 運算子綜合應用 package aaaa public class caaas 2給定乙個0 1000的整數,求各位數的和,例 如345的結果是3 4 5 12注 分解數字既可以先 除後模也可以先模後除 知識點 變數和...

2018級第一次上機《點燈》題解

時間限制 300ms 記憶體限制 65536kb有n個燈,編號0 n 10 n 1,一開始都是關閉狀態。每次操作會撥動乙個區間 l,r 燈的開關,也就是說,對於燈i,l i rl i r,如果i是關閉狀態,則操作會使燈亮,反之會使燈滅。請問k次操作後有多少燈亮著。多組輸入資料 每組資料第一行兩個數n...