小易有一个长度为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
/*
复杂度为O(n)
统计三种数字:
1.能被4整除,取名div4,(可以认为在此题中这种数字比较珍贵)
2.只能被2整除,但不能被4整除d,iv2
3.不能被2整除,div1 a.如果不存在只能被2整除的数字,那么按照div1和div4相间排列即可满足要求,且div1可以占据首尾,即div1 <= div4 + 1; b.如果存在div2,将它们放在最后面,1 4 1 4 2 2 2排列 c.其他情况,No */ #include<bits/stdc++.h> using namespace std; bool judge(vector<int>& vec) { int div1 = 0, div2 = 0, div4 = 0;//,,不能被2整除的数字个数div1 for(auto &c : vec) { if(c % 2 == 0) { if(c % 4 == 0) div4++;//能被4整除的数字个数div4 else div2++;//统计只能被2整除的数字个数div2 } else div1++;//不能被2整除的数字个数div1 } if(div2 == 0)//如果不存在只能被2整除的数字 { if(div1 - 1 <= div4)//1 4 1 4 1 4 1符合要求 return true; } else//存在只能被2整除的数字 { if(div1 <= div4)//1 4 1 4 1 4 2 2 2符合要求 return true; } return false; } int main() { int n; while(cin >> n) { for(int i = 0; i < n; i++) { int m; cin >> m; vector<int> vec; int temp; for(int j = 0; j < m; j++) { cin >> temp; vec.push_back(temp); } if(judge(vec)) cout << "Yes" << endl; else cout << "No" << endl; } } return 0; }
#include<iostream> #include<vector> usingnamespacestd; intmain() { intt; cin>>t; vector<string> re; for(inti=0;i<t;++i){ intn; cin>>n; intcount_4=0,count_2=0,count_1=0; for(inti=0;i<n;++i){ intm; cin>>m; if(m%4==0) ++count_4; else if(m%2==0) ++count_2; else ++count_1; } count_2=count_2%2; if(count_4>=count_2+count_1-1) re.push_back("Yes"); else re.push_back("No"); } for(auto s:re) cout<<s<<endl; } |