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