?? 2132.cpp
字號:
/*
由于最高頻數的頻度大于 n/2, 故若將其排序, 則第 n/2+1 必為此數. 問題是這就要
求一個 1Mb(4*250000) 的數組, 不符合題目的數據要求.
不過, 如果數組是有序的, 那么中間連續至少 n/2+1 個 X, 兩頭非 X 的數若與 X
逐一匹配, 則必有剩余的 X 沒能被匹配. 顯然, 這個性質與數組是否有序無關.
如果將 X 理解為進棧, 非 X 理解為出棧, 那么最后棧必非空且棧頂為 X.
可是, X 是未知的, 這個理解不能解決問題. 然而注意到存在足夠多個相同的 X,
因此如果將不相同的數互相抵掉, 則無論如何剩余的數還是 X. 所以, 可以建立一個棧,
棧空時總進棧, 棧非空時若當前元素與棧頂元素相同則進棧, 否則出棧. 這樣, 最后棧
也必非空且棧頂元素必是 X.
因為棧中元素總相同, 故只須記一個Copy及棧指針. 顯然, 這是 O(n) 時間和 O(1)
空間復雜度的算法, 而且是 Online 的.
下面程序用 s 記錄棧中元素, p 記棧指針, c 記當前元素.
*/
#include <stdio.h>
const int L = 1000;
char buf[L+1];
bool b[128];
int l;
int geti() {
int r=0, ch, f=0;
if (buf[l]=='-') f=-1,l++;
while(b[ch=buf[l++]])r=10*r+(ch&0xF);
if (ch==0) { l=0; fgets(buf,L+1,stdin); while(b[ch=buf[l++]])r=10*r+(ch&0xF); }
return f^(r+f);
}
int main() {
for (int i='0'; i<='9'; i++) b[i]=1;
int n, c, s, p;
while (fgets(buf,L+1,stdin)!=NULL) {
l=0; n=geti(); s=geti(); p=1;
for (int i=1; i<n; i++) { c=geti(); p?(c==s?++p:--p):(s=c,p=1); }
printf("%d\n",s);
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -