1. 程式人生 > >洛谷 P2397 yyy loves Maths VI (mode) 題解

洛谷 P2397 yyy loves Maths VI (mode) 題解

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) 題解