T133309 57级返校测试重测-T2-选票统计

大致题意:

  • 找出个数超过n/4的数们。

基本思路:

  • 一开始我是用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;
}
原文地址:https://www.cnblogs.com/FUXyao/p/12876087.html