網易2018語音算法筆試編程1

  1. 題目:
    小易有一個長度爲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. 示例:
    輸入
    2
    3
    1 10 100
    4
    1 2 3 4
    輸出
    Yes
    No

  3. 思路:
    要使得每相鄰的兩個數的乘積是4的倍數,那麼相鄰的兩個數一定爲以下兩種情況:
    1.兩個偶數;
    2.一個奇數和一個4的倍數
    統計奇數個數和4的倍數的個數,如果4的倍數的個數大於等於奇書的個數,就一定可以滿足條件。(可以使出現的每一個奇數都能搭配一個4的倍數)
    另一種特殊情況是1 4 1這種情況,奇數個數+4的倍數個數=n,且奇數個數比4的倍數個數多1.也滿足條件。

  4. 代碼:

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章