场景

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

  1. let judgeFourArr=(arr)=>{
  2. let twoCount=0,zCount=0,fouCount=0,judge=false
  3. arr.map((ele,inex,arr)=>{
  4. if(ele%2==0&&ele%4!=0){
  5. twoCount++
  6. } else if(ele%4==0){
  7. fouCount++
  8. } else{
  9. zCount++
  10. }
  11. })
  12. if(fouCount+1>=(zCount+twoCount)||(fouCount>=zCount&&twoCount>0)){
  13. judge=true
  14. }
  15. return judge?'yes':'no'
  16. }

java版本

  1. import java.util.Scanner;
  2. public class Main {
  3. public static void main(String[] args){
  4. Scanner in = new Scanner(System.in);
  5. //ArrayList<String> list = new ArrayList<String>();
  6. while(in.hasNext()){
  7. int t = in.nextInt();
  8. for(int i = 0;i<t;i++){
  9. int n = in.nextInt();
  10. int a[] = new int[n];
  11. for(int j = 0;j<n;j++){
  12. a[j] = in.nextInt();
  13. }
  14. int mod4_num=0 , mod2_num=0,odd=0;
  15. for(int k = 0;k<a.length;k++){
  16. if(a[k] % 4 ==0){
  17. mod4_num++;
  18. }else if(a[k] % 2 ==0){
  19. mod2_num++;
  20. }else{
  21. odd++;
  22. }
  23. }
  24. if(mod2_num > 0){
  25. if(mod4_num >= odd){
  26. System.out.println("Yes");
  27. }else{
  28. System.out.println("No");
  29. }
  30. }else{
  31. if(mod4_num >=(odd-1)){
  32. System.out.println("Yes");
  33. }else{
  34. System.out.println("No");
  35. }
  36. }
  37. }
  38. }
  39. }
  40. }