洛谷 P2397 yyy loves Maths VI (mode) 題解
阿新 • • 發佈:2017-10-11
clas 由於 http 讀下 dba lov 格式 輸出格式 否則
此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。
題目鏈接:https://www.luogu.org/problem/show?pid=2397
題目背景
自動上次redbag用加法好好的刁難過了yyy同學以後,yyy十分憤怒.他還擊給了redbag一題,但是這題他驚訝的發現自己居然也不會,所以只好找你
題目描述
[h1]udp2:第一題因為語言性質問題,比賽結束後將所有c/c++的程序的內存調為2.2mb後重測。[/h1]
他讓redbag找眾數
他還特意表示,這個眾數出現次數超過了一半
一共n個數,而且保證有
n<=2000000
而且每個數<2^31-1
輸入輸出格式
輸入格式:第一行一個整數n
第二行n個整數
輸出格式:一行,這個眾數
輸入輸出樣例
輸入樣例#1:5 2 3 3 3 3輸出樣例#1:
3
說明
時間限制 1s
空間限制 3.5M(你沒看錯3.5M)
有人想水過,但我告訴你這空間是不夠的
//kkksc03偷偷地說:你隨便輸出一個數字吧,都有1/2的幾率。不過這可是樂多賽,值得不值得你看著辦。所以最好想一想正解。
分析:
這題的空間很小,是不可能把所有數讀下來排序的。
由於眾數的出現次數大於總數的一半,可以在讀入過程中假定當前的數是眾數,如果下一個數與它相等,cnt++,否則cnt--.
如果cnt<0,說明當前數被抵消沒了,再假定一個新的眾數繼續抵消。
相當於用眾數去抵消其他的數。由於眾數出現次數大於一半,所以無論如何最後都能剩下眾數。
以及這題快讀會T2個點,要寫scanf。簡直有毒。
AC代碼:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 6 int n,now,x,cnt = 1; 7 8 int main() 9 { 10 scanf("%d%d",&n,&now); 11 for(int i = 2;i <= n;++ i) 12 { 13 scanf("%d",&x); 14 if(x != now) cnt --; 15 else cnt ++; 16 if(cnt < 0) cnt = 1,now = x; 17 } 18 printf("%d\n",now); 19 return 0; 20 }
洛谷 P2397 yyy loves Maths VI (mode) 題解