2018網易筆試程式設計題----重排數列

Roninwz發表於2017-10-11

題目 :

小易有一個長度為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。

輸入例子1:
2
3
1 10 100
4
1 2 3 4

輸出例子1:
Yes
No

思路:每個奇數左右兩側的數必須是4的倍數,因此只要求出奇數的個數和4的倍數的數的個數,後者大於前者即可輸出“Yes”,否則輸出“No”

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
	int i = 0, num;
	cin >> num;
	vector<string> str;
	while (i < num)
	{
		++i;
		int size, temp;
		vector<int> vec1, vec2;
		cin >> size;
		for (int j = 0; j < size; ++j)
		{
			cin >> temp;
			vec1.push_back(temp);
			int k = 1;
			while (temp != 0)
			{
				if (temp % 2 == 0){
					k *= 2;
					temp /= 2;
				}
				else{
					vec2.push_back(k);
					break;
				}
			}
		}
		int odd = 0, even4 = 0;
		for (int j = 0; j < size; ++j)
		{
			if (vec2[j] >= 4)
				even4++;
			if (vec2[j] == 1)
				odd++;
		}
		if (even4 >= odd){
			str.push_back("Yes");
		}
		else{
			str.push_back("No");
		}
	}
        vector<string>::iterator beg;
	for (beg = str.begin(); beg != str.end(); ++beg)
	{
		if (beg != (str.end() - 1))
			cout << *beg << endl;
		else
			cout << *beg;
	}
	return 0;
}




轉載來自:http://blog.csdn.net/stopbl/article/details/77942025

相關文章