时间限制: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;
}
/*
2
3
1 10 100
4
1 2 3 4
*/