网易算法工程师计算机视觉,编程第二道
#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