1. 程式人生 > >luogu P2397 yyy loves Maths VI (mode)

luogu P2397 yyy loves Maths VI (mode)

spa -s 標準 lag 背景 badge 時間限制 個人 IT

題目背景

自動上次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的幾率。不過這可是樂多賽,值得不值得你看著辦。所以最好想一想正解。

數學題?求重數?這不太簡單了。

可是這空間為啥只給3.5M啊,這咋寫?

(自擬)看了這個題後:

IQ 25的YYF怯怯說:拿個數組把出現的記錄下來,看看哪個數出現次數最多。

IQ 120的WLZ無力說:排一下序,既然重數超過一半,那麽中間的位置一定是重數。

IQ 250的LXL欣然的說:這還不簡單以第一個數為標準,第一個數出現次數為1,下一個數若與這個數相同,則這個數的次數+1,若不相同則-1,若做標準的數次數為零,則下個數將這個替換掉,因為重數出現次數超過了一半,所以最後剩下的那個標準數,只能是重數。

WLZ的代碼:

#include<bits/stdc++.h>
using namespace std;
int a[2000001],n;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+1+n);
    cout<<a[n/2];
}

LXL的代碼:

#include<bits/stdc++.h>
using namespace std;
int n,flag,x,cnt,now;
int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&x); if(cnt==0)now=x,cnt++; else { if(now==x) { cnt++; } else cnt--; } } printf("%d",now); }

此為個人略解,轉載請標明出處:http://www.cnblogs.com/rmy020718/p/8835352.html

luogu P2397 yyy loves Maths VI (mode)