-
題目:
小易有一個長度爲N的正整數數列A = {A[1], A[2], A[3]…, A[N]}。
牛博士給小易出了一個難題:
對數列A進行重新排列,使數列A滿足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍數。
小易現在需要判斷一個數列是否可以重排之後滿足牛博士的要求。
輸入描述:
輸入的第一行爲數列的個數t(1 ≤ t ≤ 10),
接下來每兩行描述一個數列A,第一行爲數列長度n(1 ≤ n ≤ 10^5)
第二行爲n個正整數A[i](1 ≤ A[i] ≤ 10^9)
輸出描述:
對於每個數列輸出一行表示是否可以滿足牛博士要求,如果可以輸出Yes,否則輸出No。 -
示例:
輸入
2
3
1 10 100
4
1 2 3 4
輸出
Yes
No -
思路:
要使得每相鄰的兩個數的乘積是4的倍數,那麼相鄰的兩個數一定爲以下兩種情況:
1.兩個偶數;
2.一個奇數和一個4的倍數
統計奇數個數和4的倍數的個數,如果4的倍數的個數大於等於奇書的個數,就一定可以滿足條件。(可以使出現的每一個奇數都能搭配一個4的倍數)
另一種特殊情況是1 4 1這種情況,奇數個數+4的倍數個數=n,且奇數個數比4的倍數個數多1.也滿足條件。 -
代碼:
#include<iostream>
#include<vector>
using namespace std;
void solve(vector<int> a,int n){
int c1=0,c2=0;
for(int i=0;i<n;i++){
if(a[i]%2==1) c1++;
if(a[i]%4==0) c2++;
}
if(c2>=c1||(c1+c2==n&&(c1-c2)==1))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
int main(){
int N;
cin>>N;
vector<vector<int> > a(N);
for(int i=0;i<N;i++){
int num;
cin>>num;
for(int j=0;j<num;j++){
int temp;
cin>>temp;
a[i].push_back(temp);
}
}
for(int i=0;i<N;i++)
solve(a[i],a[i].size());
return 0;
}