场景
小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]…, A[N]}。
牛博士给小易出了一个难题:
对数列A进行重新排列,使数列A满足所有的A[i] * Ai + 1都是4的倍数。
小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。
输入描述
输入的第一行为数列的个数t(1 ≤ t ≤ 10),
接下来每两行描述一个数列A,第一行为数列长度n(1 ≤ n ≤ 10^5)
第二行为n个正整数Ai
输出描述
对于每个数列输出一行表示是否可以满足牛博士要求,如果可以输出Yes,否则输出No。
输入例子1:
1 10 100
输出例子
yes
解题思路
首先绝对不要被逻辑绕进去,我们不用具体去排列,考虑怎么排,只要考虑如果队列符合要求,那么需要把什么数字来满足什么数字的需求。
简单分析之后 ,得到如下的三类数字。
1 不能被2整除也不能被4整除的,这种数必须有一个被4整除的紧邻才能符合要求
2 只能被2整除不能被4整除,这种有个特点就是连续的两个被2整除的排列时也能符合要求
3 能被4整除的,这种放在任何位置都是允许的
代码如下
javascript版本
let judgeFourArr=(arr)=>{
let twoCount=0,zCount=0,fouCount=0,judge=false
arr.map((ele,inex,arr)=>{
if(ele%2==0&&ele%4!=0){
twoCount++
} else if(ele%4==0){
fouCount++
} else{
zCount++
}
})
if(fouCount+1>=(zCount+twoCount)||(fouCount>=zCount&&twoCount>0)){
judge=true
}
return judge?'yes':'no'
}
java版本
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
//ArrayList<String> list = new ArrayList<String>();
while(in.hasNext()){
int t = in.nextInt();
for(int i = 0;i<t;i++){
int n = in.nextInt();
int a[] = new int[n];
for(int j = 0;j<n;j++){
a[j] = in.nextInt();
}
int mod4_num=0 , mod2_num=0,odd=0;
for(int k = 0;k<a.length;k++){
if(a[k] % 4 ==0){
mod4_num++;
}else if(a[k] % 2 ==0){
mod2_num++;
}else{
odd++;
}
}
if(mod2_num > 0){
if(mod4_num >= odd){
System.out.println("Yes");
}else{
System.out.println("No");
}
}else{
if(mod4_num >=(odd-1)){
System.out.println("Yes");
}else{
System.out.println("No");
}
}
}
}
}
}