网易算法工程师计算机视觉,编程第二道
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using std::cout;
using std::cin;
using std::vector;
using std::string;
bool isValidArray(vector<int> nums){
int onlyTwo = 0;
int Four = 0;
int odd = 0;
for (auto& num: nums){
if (num % 2 != 0){odd++;}
else{
if (num %4 != 0) onlyTwo++;
else {Four++;}
}
}
int block = 0;
if (onlyTwo > 0){
block = odd + 1;
}
else {block = odd;}
int sieve = block - 1;
if (Four < sieve){
return false;
}
else{
return true;
}
}
int main(){
int T;
cin >> T;
for (int i = 0; i != T; ++i){
int N;
cin >> N;
vector<int> nums;
for (int j = 0; j != N; ++j){
int tmp;
cin >> tmp;
nums.push_back(tmp);
}
if (isValidArray(nums)){cout << "Yes\n";}
else {cout << "No\n";}
nums.clear();
}
return 0;
}
想法:把所有数分成奇数,只是2倍数的偶数,其它偶数(也就是能被4整除),如果存在只是2的倍数的偶数,把这些数看成一个,加上奇数,形成了一些空隙,4 的倍数的那些偶数可以插空。如果可以填满,那么就是 yes,否则就是 no


