算法題——最好一樣

題目內容

題目描述
給出一個序列包含n個正整數的序列A,然後給出一個正整數x, 你可以對序列進行任意次操作的,每次操作你可以選擇序列中的一個數字,讓其與x做按位或運算。你的目的是讓這個序列中的衆數出現的次數最多。請問衆數最多出現多少次。
輸入
輸入第一行僅包含兩個正整數n和x,表示給出的序列的長度和給定的正整數。(1<=n<=100000,1<=x<=1000)接下來行有n個正整數,即這個序列,中間用空格隔開。(1<=a_i<=1000)
輸出
輸出僅包含一個正整數, 表示衆數最多出現的次數。

解題思路

如何使衆數出現次數最多?

這是本題的關鍵和難點,因爲可以對序列進行任意次操作,每次操作都可以選擇任意一個數字,如果每次隨機選擇一個數字進行操作不僅效率低下,更有可能因爲不知道何時可以結束操作而導致結果錯誤。

考慮到任意兩個數進行或操作多次與進行一次結果相同,即:
設有兩個數a、b,則:a|b|b|…|b = a|(b|b|…|b) = a|b
我們可以遍歷整個序列,將整個序列與x進行或操作,這時的衆數的數量即爲最多出現的次數。

如何獲得衆數出現的次數?

常用方法是先對序列進行排序,然後遍歷序列,連續出現次數最多的數字即爲衆數,該數字出現次數即爲所求結果。
本題排序時使用的是algorithm.h文件中的sort()函數,參見C++中sort()的使用

代碼

#include <iostream>
#include<algorithm>

using namespace std;

int get_most(int *arr, int length)
{
	int sign, tmp = 1, max = 1;
	sort(arr, arr + length);  //對序列排序
	for (int i = 1; i < length; i++)
	{
		if (arr[i] == arr[i - 1])	//如果連續 
		{
			tmp++;
			if (tmp > max) max = tmp;
		}
		else  //不再連續
			tmp = 1;
	}
	return max;
}


int main()
{
	int length, x,most;
	cin >> length >> x;  //序列長度 x值
	const int L = length;
	int *a = new int[length];
	for (int i = 0; i < L; i++)  //讀入序列
		cin >> a[i];

	for (int i = 0; i < length; i++)  //遍歷序列
		a[i] = a[i] | x;    //按位或
	most = get_most(a, length);  //獲取最多次數
	delete[]a;
	cout << most << endl;
	system("pause");
	return 0;
}

至此這道題就解完了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章