小易有一个长度为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
//寻找可以被4和不可以被2整除的数的个数 //一个不可以被4和2整除的数周围必须有2个可以被4整除的数,除了第一个 //那么对于每一个n1都必须有一个属于它的n4,如果没有n2,那第一个n1可以和第2个共有一个 //所以就是 n4>=n1||(n2==0&&n4>=n1-1)#include<iostream> using namespace std; int main(){ int n; int l; int num; int n1,n4; while(cin>>n){ for(int i = 0;i<n;i++){ cin>>l; n1 = 0; n4 = 0; for(int j = 0;j<l;j++){ cin>>num; if(num%4==0) n4++; else if(num%2!=0) n1++; } if(n4>=n1||(n4>=n1-1&&(n4+n1)==l)) cout<<"Yes"<<endl; else cout<<"No"<<endl; } } return 0; }
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"); } } } } } }
#include<stdio.h> int main(){ int T,n,i,x; for(scanf("%d",&T);T--;){ int cnt1=0,cnt2=0,cnt4=0; for(scanf("%d",&n),i=0;i<n;i++){ scanf("%d",&x); if(x%4==0) cnt4++; if(x%2==0&&x%4!=0) cnt2++; if(x%2==1) cnt1++; } printf("%s\n",cnt2==0?(cnt4>=cnt1-1?"Yes":"No"):(cnt4>=cnt1?"Yes":"No")); } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int n = in.nextInt(); for (int i = 0; i < n; i++) { int length = in.nextInt(); int count4 = 0; int count2 = 0; for (int j = 0; j < length; j++) { int num = in.nextInt(); if (num % 4 == 0) { count4++; } else if (num % 2 == 0) { count2++; } } if (count2 > 1) { if (count4 >= length - count2 - count4 - 1) { System.out.println("Yes"); } else { System.out.println("No"); } } else { if (count4 >= length - count4 - 1) { System.out.println("Yes"); } else { System.out.println("NO"); } } } } } }
public class Main4 { public static void main(String[] args) { //预处理数据 可以不保存到内存,我这图个省事。 Scanner sc = new Scanner(System.in); int count = sc.nextInt(); int[][] arrs = new int[count][]; for (int i = 0; i < arrs.length; i++){ int arrLength = sc.nextInt(); arrs[i] = new int[arrLength]; for(int j = 0; j < arrLength; j++){ arrs[i][j] = sc.nextInt(); } } sc.close(); for (int[] arr : arrs){ int counter = 0; for(int i = 0; i < arr.length; i++){ counter += (((arr[i] & 1) == 1) ? 1 : ((arr[i] & 3) == 0) ? -1 : 0);//是否为奇数如果为奇数+1, 如果能被4整除 -1 , 否则 +0 } System.out.println(counter <= 0 ? "Yes" : "No");//如果为4的倍数的数大于或等于包含奇数的数量 } } }
首先考虑一下极端情况: 1.不论数组有多大。每个元素都为2(即都是2的倍数),这时2的个数等于数组大小, 显然是符合公式的; 2.只有两个奇数和一个4(即只有一个4的倍数,按照141的顺序排列),这时候每增加 一个4都可以再增加一个任意元素,这时候4的个数乘2加1等于数组大小; 综合这两种情况: 只需要遍历数组知道是4和2的倍数的元素到底有多少就可以确定输出结果了, 代码如下:
importjava.util.*;
publicclassMain { publicstaticvoidmain(String[] args) { Scanner in = newScanner(System.in); intcount = Integer.parseInt(in.nextLine()); ArrayList<Boolean> result = newArrayList<>(); for(inti = 1;i<=count;i++){ intnum = Integer.parseInt(in.nextLine()); intbase2 = 0; intbase4 = 0; String[] indata = in.nextLine().split(" "); for(String e:indata){ intval = Integer.parseInt(e); if(val%4==0) base4++; else{ if(val%2==0) base2++; } } if(base2+base4*2>=num) result.add(true); else result.add(false); } for(booleane:result){ if(e) System.out.println("Yes"); else System.out.println("No"); } } }
private static String getResult(int[] input){ int countOdd = 0,countFour = 0; for(int i = 0;i < input.length; i++){ if(input[i]%2 == 1){countOrd++;} if(input[i]%4 == 0){countFour++;} } if(countOrd <= countFour){return "Yes";}else{return "No";} }
public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); int t=sc.nextInt(); for(int i=0;i<t;i++){ int n=sc.nextInt(); int n1=0; int n4=0; for(int j=0;j<n;j++){ int num=sc.nextInt(); if(num%4==0) n4++;//统计4的倍数的个数 else if(num%2==1) n1++;//统计奇数的个数 } //只有n1+n4的个数小于n,且n1大于n4时,输出No,其他情况都是Yes if(n1+n4<n&&n1>n4) System.out.println("No"); else System.out.println("Yes"); } } }
语言:C++ 运行时间: 308 ms 占用内存:376K 状态:答案正确
每个数都按规则变成0,1,2,能被4整数变为2,被2整除变为1,否则为0。
问题转化为相邻两数之和大于等于2。所以所有相邻两数和的和至少为2*(n-1)。
因为所有相邻两数和的和把端点计算了1次,其余点计算了2次。据此判断一下即可。
本套8道题的C++代码已挂到了我的GitHub(https://github.com/shiqitao/NowCoder-Solutions)上,持续更新。
#include <iostream>
using namespace std;
int main()
{
int t; cin >> t;
for (int i = 0; i < t; i++) {
int n; cin >> n;
int sum = 0, num;
bool iftwo = false;
for (int j = 0; j < n; j++) {
cin >> num;
if (num % 4 == 0) {
sum += 2;
iftwo = true;
}
else if (num % 2 == 0) sum += 1;
}
if (sum > n - 1) cout << "Yes" << endl;
else if (sum == n && iftwo) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
#include "bits/stdc++.h" using namespace std; int main() { int t=0,n=0; cin>>t; while(t--) { cin>>n; int temp=0,k4=0,k2=0,k1=0; for(int i=0; i<n; i++) { cin>>temp; if(temp%2==0) { if(temp%4==0) k4++; else if((k2+k4)<2) k2++; } else k1++; } if(k1>k4) cout<<"No"<<endl; else if((k2+k4)<2) cout<<"No"<<endl; else cout<<"Yes"<<endl; } }
题目在数列中数的个数即 n=1 时说明好像并不清晰,如测试组中有 1 494 对于这组数列494并不整除4,但系统判定输出Yes,不是很明白其原因
按照楼上大神“云y”的思路,果然通过了,可是作为小白的我还是不太明白这具体是什么意思,求大神解析
a = input()
for i in range(a):
total = 0
num = 0
x_1 = input()
x = raw_input().split()
for m in x:
if int(m) % 4 == 0:
total += 1
elif int(m) % 2 == 0:
num += 1
if num == 0:
if len(x)-total <= total+1:
print 'Yes'
else:
print 'No'
else:
if len(x)-total-num+1 <= total+1:
print 'Yes'
else:
print 'No'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include<iostream> usingnamespacestd; intmain() { intn; cin>>n; for(inti = 0; i < n; i++) { intnum; cin>>num; inta; intisf[3] = {0}; for(intj = 0; j < num; j++) { cin>>a; if(a % 2 == 0 && a % 4 != 0) isf[1]++; elseif(a % 4 == 0) isf[2]++; else isf[0]++; } if(isf[2] < isf[0]) cout<<"No"<<endl; else cout<<"Yes"<<endl; } } |