大致题意:
基本思路:
- 一开始我是用map做的,然后就很玄学的TLE了。
- 啊,那就换个法吧。
- 先排个序,然后一样的数就在一起了,
- 再然后直接从前往后遍历一下,就能得出结果了。
Code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
using namespace std;
#define R read()
#define GC getchar()
#define ll long long
#define ull unsigned long long
#define INF 0x7fffffff
#define LLINF 0x7fffffffffffffff
ll read(){
ll s=0,f=1;
char c=GC;
while(c<'0'||c>'9'){if(c=='-')f=-f;c=GC;}
while(c>='0'&&c<='9'){s=s*10+c-'0';c=GC;}
return s*f;
}
int n,m[130010];
int cnt,t;
int flag;//是0表示一个获胜的也没有,就要输出"No such person."。
//是1表示有获胜的。
int main(){
n=R;
for(int i=1;i<=n;++i){
m[i]=R;
}
sort(m+1,m+n+1);//排序
t=m[1];cnt=1;//先记录一下
for(int i=2;i<=n;++i){//从前往后遍历,因为第一位已经记录了,所以从下标2开始
if(m[i]==t){//如果和前面一样,那么计数+1
++cnt;
}else{//不一样,说明到头了
if(cnt>n/4){//看记录的个数是否超过了n/4
flag=1;//标记
printf("%d
",t);
}
t=m[i];cnt=1;//再记录下一个数
}
}
if(cnt>n/4){//再判断一下,因为在遍历的时候最后并没有到头
flag=1;
printf("%d
",t);
}
if(flag==0){
printf("No such person.
");
}
return 0;
}