時間限制:C/C++語言1000MS;其他語言3000MS
內存限制:C/C++語言131072KB;其他語言655360KB
題目描述:
給出一個序列包含n個正整數的序列A,然後給出一個正整數x,你可以對序列進行任意次操作,每次操作你可以選擇序列中的一個數字,讓其與x做按位或運算。你的目的是讓這個序列中的衆數出現的次數最多。請問衆數最多出現多少次?
輸入:
輸入第一行僅包含兩個正整數n和x,表示給出的序列的長度和給定的正整數。
(1<=n<=100000,1<=x<=1000)
接下來一行有n個正整數,即這個序列,中間用空格隔開。(1<=a_i<=1000)
輸出:
輸出僅包含一個正整數,表示衆數最多出現的次數。
樣例輸入:
5 2
3 1 3 2 5
樣例輸出:
3
代碼:
#include <iostream>
using namespace std;
#include <algorithm>
#include <string>
#include <time.h>
// 十進制轉二進制
// 參考https://www.cnblogs.com/zwjjj/p/9953718.html
string intToA(int n, int radix) //n是待轉數字,radix是指定的進制
{
string ans = "";
do {
int t = n % radix;
if (t >= 0 && t <= 9)
{
ans += t + '0';
}
else
{
ans += t - 10 + 'a';
}
n /= radix;
} while (n != 0); //使用do{}while()以防止輸入爲0的情況
reverse(ans.begin(), ans.end());
return ans;
}
int main(void)
{
//cout << (2 | 5) << endl;
/************************** 一.接受數據 **************************/
int n; // 輸入的長度與
int x; // 輸入的正整數
// 接收第一行輸入
cin >> n;
cin >> x;
// 第二行輸入用動態數組接收
int* array = new int[n];
// 循壞接收序列
for (int i = 0; i < n; i++)
{
cin >> array[i];
}
// 測試輸入
/*for (int i = 0; i < n; i++)
{
cout << array[i] << " ";
}
cout << endl;*/
long start = clock(); //開始時間
/************************** 二.找到衆數 **************************/
// 1. 排序接受的數組
sort(array, array + n);
// 2. 在從小到大排序的數組中找出出現次數最多的數字
int num[100000] = {0}; // 記錄出現的次數,最大的數是100000
for (int i = 0; i < n; i++)
{
num[array[i]]++;
}
// 3. 找到數字最大元素的下標
int maxPosition = max_element(num, num + 100000) - num;
// maxPosition 放置的最大數的下標,num[maxPosition]放的是出現最多的數字的次數
int mode = maxPosition; // 衆數就是出現次數最多的
int cnt = 0; // 統計出現衆數的個數
//cout << mode << " mode" << endl;
for (int i = 0; i < n; i++)
{
if ((x | array[i]) == mode)
{
cnt++;
}
}
cout << cnt << endl;
// 釋放動態數組
delete[]array;
long finish = clock(); //結束時間
cout << "時間:" << (double)(finish - start) / CLOCKS_PER_SEC << endl;
system("pause");
return 0;
}