• 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;
    }
    
  • 相关阅读:
    MySQL 批量删除相同前缀的表
    MySQL 命令登录
    MySQL 密码修改
    谷歌浏览器开发者工具截图
    VIM命令图解
    基于环境变量为多用户配置不同的JDK(win)
    Reddit: 只有独生子女才明白的事
    JSONObject与null
    SpringFramework中重定向
    XML修改节点值
  • 原文地址:https://www.cnblogs.com/FUXyao/p/12876087.html
Copyright © 2020-2023  润新知