【网易】重排数列

来源:互联网 发布:html 文字游戏源码 编辑:程序博客网 时间:2024/06/07 18:21

题目描述

小易有一个长度为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。

测试用例

input:231 10 10041 2 3 4output:YesNo

解题思路

如果不存在不能被4整除的偶数,那么只要4个倍数的数个数大于奇数的个数就行。
否则4个倍数个数等于奇数的个数。

代码

#include <iostream>#include <vector>using namespace std;void func(vector<int> &v){    bool flag = false;    int odd_num = 0;    int four_num = 0;    for (int i = 0;i < v.size();i++)    {        if(v[i] % 2 != 0) odd_num++;        else {            if (v[i] % 2 == 0 && v[i] % 4 != 0 ) flag = true;            if (v[i] % 4 == 0) four_num++;        }    }    if (!flag){        if (four_num >= odd_num - 1) cout << "Yes"<<endl;        else cout <<"No"<<endl;    }else{        if (four_num >= odd_num) cout << "Yes"<<endl;        else cout << "No"<<endl;    }}int main(){    int n, m;    cin >> n;    while(n--){        cin >> m;        vector<int> v;        while (m--){            int temp;            cin >> temp;            v.push_back(temp);        }        func(v);    }    return 0;
原创粉丝点击