Bzoj2456 mode
Position:
List
Description
- 給你一個n個數的數列,其中某個數出現了超過n div 2次即衆數,請你找出那個數。
Solution
衆數出現的次數>=n/2+1,採用抵消的方法,如果當前數不等於之前記錄的數給計數器-1 else +1,當計數器<=0時,可以update數。
證明:對於每一個不是衆數的數,它一定會被抵消完。剩下的數衆數的個數最多減去前面個數/2,所以個數仍大於剩下的數的1/2。如果當前找到的數的衆數,那麼接下來它就不會被抵消掉。
Code
// <mode.cpp> - 07/28/16 19:34:21
// This file is made by YJinpeng,created by XuYike's black technology automatically.
// Copyright (C) 2016 ChangJun High School, Inc.
// I don't know what this program is.
#include <cstdio>
using namespace std;
int n,k,ans,now;
int main()
{
freopen("mode.in","r",stdin);
freopen("mode.out","w",stdout);
scanf("%d",&n);
scanf("%d",&now);
k=0;ans=now;
for(int i=2;i<=n;i++){
scanf("%d",&now);
if(now==ans)k++;else k--;
if(k<=0)ans=now,k=1;
}
printf("%d",ans);
return 0;
}
這裏加一個讀入輸出優化,192MS。提高Rank。
// <mode.cpp> - 07/28/16 19:34:21
// This file is made by YJinpeng,created by XuYike's black technology automatically.
// Copyright (C) 2016 ChangJun High School, Inc.
// I don't know what this program is.
#include <cstdio>
using namespace std;
int n,k,ans,now;
int w;char ch;
inline int getint(){
ch=getchar();w=0;
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=getchar();
return w;
}
inline void Plus(int a){
if(a>=10)Plus(a/10);
putchar(a%10+'0');
}
int main()
{
n=getint();now=getint();
k=0;ans=now;
for(int i=2;i<=n;i++){
now=getint();
if(now==ans)k++;else k--;
if(k<=0)ans=now,k=1;
}
Plus(ans);
return 0;
}