重排數列(7)

2021-09-25 19:10:46 字數 1159 閱讀 7845

(此題**牛客網網易2018秋招筆試真題)

有乙個長度為n的正整數數列a = 。

對該數列進行重新排列,使數列a滿足所有的a[i]*a[i+1](1 <= i <= n-1)都是4的倍數。

判斷某一數列重新排列之後是否滿足以上要求。

輸入第一行為需要判斷的數列個數t(1 <= t <= 10),

接下來每兩行,第一行表示數列長度n(1 <= n <= 10^5),第二行為n個正整數a[i](1 <= a[i] <= 10^9)。

若滿足輸出yes,否則輸出no。

2 1 10 100

4 1 2 3 4

yesno

最簡單粗暴方法,窮舉所有可能,對輸入陣列進行重排列,考慮所有可能,然後乙個個進行測試。

結果毫無疑問會超時。。。

進行分析陣列,數的大小最小為1,省去了考慮0的麻煩,因為0可以被任何非0數整除。

1 如果數列中某個數是4的倍數,則它左右a[i-1]*a[i]和a[i]*a[i+1]都可以被4整除,通俗來講,若數列中有4的倍數的數,則它可以救兩個非4倍的數。4倍數個數記作 n4。2個四倍數可以救3個,3個4倍數可以救4個,n4個四倍數可以救n4+1個。

2 如果數列中某個數是2的倍數,且不為4的倍數,比如6 10 18等,則這樣任意兩個2倍數放在一起就可以被4整除。這樣僅能為2整除的2倍數個數記作 n2。因為兩個2倍數可以合成為4倍數,若n2為奇數,則還剩乙個沒有匹配。但是,當僅2倍數為偶數時,就1 2 6 3而言,即使把兩個2倍數放在一塊,2倍數兩邊需要被救(6 3組合不可以被4整除,1 2組合也不可以被4整除);當僅2倍數為奇數時,例如3 6 2 10 7,2倍數兩邊還是需要被救(3 6和10 7組合),被救個數取決於非4被數非2倍數的總數,即下面的n1。 

3 若不是4倍數也不是僅2倍數,記作 n1,n1 = n - n4 - n2。

若n2為0,則4倍數可以n4+1個數,若n2 > 0,則n4可以救n4個數,則可以輸出yes,否則輸出no。n1為要被救的數,(n2&1)也是要被救的數。(n2&1)判斷是否為奇數。

#include using namespace std;

void test()

if( n2 > 0 )

else

delete a;

}}int main()

重排數列 C 方法

小易有乙個長度為n的正整數數列a 牛博士給小易出了乙個難題 對數列a進行重新排列,使數列a滿足所有的a i a i 1 1 i n 1 都是4的倍數。小易現在需要判斷乙個數列是否可以重排之後滿足牛博士的要求。輸入描述 輸入的第一行為數列的個數t 1 t 10 接下來每兩行描述乙個數列a,第一行為數列...

8 重排數列

小易有乙個長度為n的正整數數列a 牛博士給小易出了乙個難題 對數列a進行重新排列,使數列a滿足所有的a i a i 1 1 i n 1 都是4的倍數。小易現在需要判斷乙個數列是否可以重排之後滿足牛博士的要求。輸入描述 輸入的第一行為數列的個數t 1 t 10 接下來每兩行描述乙個數列a,第一行為數列...

網易2018校招 重排數列

程式設計題 重排數列 時間限制 1秒 空間限制 100768k 小易有乙個長度為n的正整數數列a 牛博士給小易出了乙個難題 對數列a進行重新排列,使數列a滿足所有的a i a i 1 1 i n 1 都是4的倍數。小易現在需要判斷乙個數列是否可以重排之後滿足牛博士的要求。輸入描述 輸入的第一行為數列...