problem description
給定含有n個元素的多重集合s,每個元素在s**現的次數稱為該元素的重數。多重集s中重數最大的元素稱為眾數。例如,s=。多重集s的眾數是2,其重數為3。對於給定的由n 個自然數組成的多重集s,計算s的眾數及其重數。如果出現多個眾數,請輸出最小的那個。
input
輸入資料的第1行是多重集s中元素個數n(n<1300000);接下來的n行中,每行有乙個最多含有5位數字的自然數,。
output
輸出資料的第1行給出眾數,第2行是重數。
sample input
sample output612
2235
2
3
思路:
首先需要排序。
每次先求中位數的重數,然後將陣列從中位數(0-最左邊的中位數和最右邊的中位數到n)分開在左邊和右邊各求中位數的重數然後比較,然後再分開在比較。這樣一直分最後就成了乙個數字的重數(分成的最小問題)。
其實這樣做已經能夠在oj ac。但是還可以進一步優化,當中位數的個數大於左側或者右側的時候可以不再向下求中位數的大小。換句話數就是當左側或者右側某一側或者兩側的數字個數小於中位數的重數的時候就可以不必向下接著進行分析。
#include #include #include using namespace std;
int a[1300000+5];
void split(int &l, int &r, int a, int n)
for(r = l + 1; r < n; r++)
}}void getmaxcnt(int &maxcnt, int &num, int a, int n)
if(maxcnt == sum)
}if(l + 1> maxcnt)
if(n - r > maxcnt)
}int main()
眾數問題 分治演算法
給定含有n個元素的多重集合s,每個元素在s 現的次數稱為該元素的重數。多重集s中重數最大的元素稱為眾數。例如,s 多重集s的眾數是2,其重數為3。對於給定的由n 個自然數組成的多重集s,計算s的眾數及其重數。如果出現多個眾數,請輸出最小的那個。input 輸入資料的第1行是多重集s中元素個數n n ...
分治演算法 眾數問題
給定含有 n 個元素的多重集合 s,每個元素在 s 現的次數稱為該元素的重數。多重 集 s 中重數最大的元素稱為眾數。例如,s 多重集 s 的眾數是 2,其重數為 3。對於給定的由 n 個自然數組成的多重集 s,程式設計計算 s 的眾數及其重數。輸入資料由檔名為 input.txt 的文字檔案提供。...
分治演算法解決眾數問題
題目 給定含有n個元素的多重集合s,每個元素在s 現的次數稱為該元素的重數。多重集s中重數最大的元素稱為眾數,如s 多重集s的眾數是2,其重數為3。分析 include using namespace std define m 100 int a m int num,val,n 重數,眾數,個數 v...