【洛谷P2397】yyy loves Maths VI (mode)【模擬】
阿新 • • 發佈:2018-11-25
題目大意:
題目連結:https://www.luogu.org/problemnew/show/P2397
給出長度為
的數列,其中的眾數個數超過了一半。求這個眾數。
思路:
資料範圍要求在
的時間複雜度內完成。
那麼排序和
,離散這些
的可以拜拜了。
那麼自然就要分析一下“眾數個數超過一半”這個條件了。
我們不難發現,一個數列眾數超過了一半,那麼在這個數列裡去掉任意兩個不相等的數字,剩餘的數字中的眾數肯定也超過了一半!
但是怎麼在這個數列中
找到兩個不相等的數呢?
顯然是不可能的。
那麼可以換一種方式看問題:
假設我們已經知道前
個數的眾數和出現次數了,那麼現在讀入第
個數,如果第
個數之前的眾數一樣,那麼就將數量加
,如果和之前的眾數不一樣,那麼眾數個數就減
,相當於去掉兩個不相等的數(一個眾數和一個不等於眾數的數)。
那麼最終留下來的眾數就是答案了。
時間複雜度
程式碼:
#include <cstdio>
using namespace std;
int n,ans,sum,x;
int main()
{
scanf("%d",&n);
while (n--)
{
scanf("%d",&x);
if (!sum) //前面的數都被消除完了,說明沒有眾數
{
ans=x;
sum++;
}
else if (ans==x) sum++;
else sum--;
}
printf("%d\n",ans);
return 0;
}