重排序列(水题)

来源:互联网 发布:数据分析在职研究生 编辑:程序博客网 时间:2024/06/06 04:24

时间限制:1秒
空间限制:32768K

题目描述
小易有一个长度为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个正整数Ai(1<=Ai<=10^9)

输出描述:
对于每个数列输出一行表示是否可以满足牛博士要求,如果可以输出Yes,否则输出No

示例1
输入
2
3
1 10 100
4
1 2 3 4

输出
Yes
No

解题思路:一开始考虑先统计4的倍数的个数,每隔一个数放一个4的倍数就行。
然后考虑到如果一个数不能被4整除但是能被2整除的话,相乘能被4整除,如2*2,10*10等。
所以我们分两个统计,一个是仅仅是2的倍数的数量,一个是是4的倍数的数量。统计出来的所有的仅仅是2的倍数的数放到一起可以保证满足条件A[i]*A[i+1]能被4整除,然后我们把这部分看成一个整体就变成了一个数!其余的就按一开始的思路每隔两个数放一个4的倍数就行,判断一下4的倍数的数量if(four>=(n-two+1)/2),这里已经保证了所有都仅仅是2的倍数的情况了。

#include <iostream>using namespace std;int main(){    int t, n, x, four, two;    cin >> t;    while(t--)    {        cin >> n;        four = 0, two = 0;        for(int i = 0; i < n; ++i)        {            cin >> x;            if(x%4==0)                four++;            else if(x%2==0)                two++;        }        if(four>=(n-two+1)/2)            cout << "Yes" << endl;        else            cout << "No" << endl;    }    return 0;}/*231 10 10041 2 3 4*/
原创粉丝点击