小易有一个长度为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。
2 3 1 10 100 4 1 2 3 4
Yes No
//我好像记得网易之前出过这几个编程题,,,
import java.util.Scanner;
public class Main {
//思路:
//
//发现一个4的倍数可以带走两个位置, X个2可以带走 x-1个位置
//
//X 4 X 4 X
public static void main(String[] args) {
Scanner sr = new Scanner(System.in);
int t = sr.nextInt();
while (sr.hasNext())
{
int n = sr.nextInt();
//int [] an = new int[n];
int four = 0, two=0;
for(int i =0;i<n;i++)
{
int num = sr.nextInt();
if(num%4==0)
four++; //能被4整除的,能带走2*four+1个位置
else if(num%2==0)
two++;
}
two = Math.max(two-1,0); //能被2整除的能带走two-1个位置
if(four*2+1+two>=n)
System.out.println("Yes");
else
System.out.println("No");
t--;
if(t==0)
break;
}sr.close();
}
}
import java.util.Scanner; /** * @Classname chongpaishulie * @Description 对数列A进行重新排列, 使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数。 * @Date 2020/8/7 14:53 * @Created by LD */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); while (t-- > 0) { int n = sc.nextInt(); //能被4整除的可以去掉两个位置;x个能被2整除的数可以去掉x-1个位置 int four = 0, two = 0; for (int i = 0; i < n; i++) { int num = sc.nextInt(); if(num % 4 == 0){ four++; }else if(num % 2 == 0){ two++; } } two = Math.max(two-1, 0); if(four*2 + two + 1 >= n){ System.out.println("Yes"); }else { System.out.println("No"); } } } }
import java.util.Scanner; /** * 判断一个正整数列重排列后是不是4的倍数 * 判断数列满足要求的条件(用捆绑法) 1.若数列中为4的倍数的元素个数 》=不是4的倍数的元素个数-1则该数列一定满足 2.当1.不满足时则查找数列中为2的倍数的元素(该元素不是4的倍数), 此时,把数列中为2的倍数的元素作为一个整体,重排列时把这个整体放在4的倍数后面, 再将整体的元素个数-1,判断是否满足若数列中为4的倍数的元素个数 》=不是4的倍数的元素个数 * */ public class Main{ public static void main(String args[]){ Scanner scn=new Scanner(System.in); int row=scn.nextInt();//共有几个数列 String rerult[]=new String[row]; for(int i=0;i<row;i++){ int four=0; int two=0; int rank=scn.nextInt();//数列中元素的个数 int src[]=new int[rank]; for(int j=0;j<rank;j++){ src[j]=scn.nextInt(); } for(int j=0;j<rank;j++){ if(src[j]%4==0){ four++; } else if(src[j]%2==0){ two++; } } //判断代码 if(four>=(rank-four-1)||four>=(rank-four-two)){ rerult[i]="Yes"; } else{ rerult[i]="No"; } } for(int k=0;k<row;k++){ System.out.print(" "+rerult[k]); } } }测试用例:好晕,这样了 为什么报答案错误呀
/*特别笨的方法,希望抛砖引玉主要想法是找出所有是4的倍数的元素,以及所有不是4的倍数,但是是2的倍数的元素。对他们进行区分处理*/import java.util.Scanner;public class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);int arrayNum=sc.nextInt();for(inti=0;i<arrayNum;i++){int ALength=sc.nextInt();int fine=0;//是4的倍数的个数int twoFine=0;//是2的倍数但不是4的倍数的个数的个数int[] array=new int[ALength];for(intj=0;j<ALength;j++){array[j]=sc.nextInt();if(array[j]%4==0)fine++;if(array[j]%4!=0&& array[j]%2==0){twoFine++;}}if(twoFine==0){//如果没有不是4的倍数但是是2的倍数的元素,4的倍数的元素大于等于一半就满足条件if(fine>=(ALength/2))System.out.println("Yes");elseSystem.out.println("No");}else{//4 2 2 5 2 6 ,可以考虑成 2 2 2 6 4 5,将2 2 2 6考虑与4是一起的。ALength=ALength-twoFine;if(fine>=(ALength-ALength/2))System.out.println("Yes");elseSystem.out.println("No");}}}}