洛谷 P2397 yyy loves Maths VI (mode) & 校积分赛(五)F. Alex的午饭

题目背景

自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居然也不会,所以只好找你

题目描述

[h1]udp2:第一题因为语言性质问题,比赛结束后将所有c/c++的程序的内存调为2.2mb后重测。[/h1]

他让redbag找众数

他还特意表示,这个众数出现次数超过了一半

一共n个数,而且保证有

n<=2000000

而且每个数<2^31-1

输入格式

第一行一个整数n

第二行n个整数

输出格式

一行,这个众数

输入输出样例

输入 #1复制

5
2 3 3 3 3

输出 #1复制

3

说明/提示

时间限制 1s

空间限制 3.5M(你没看错3.5M)

有人想水过,但我告诉你这空间是不够的

//kkksc03偷偷地说:你随便输出一个数字吧,都有1/2的几率。不过这可是乐多赛,值得不值得你看着办。所以最好想一想正解。

 

                                           F. Alex的午饭

单点时限: 3.0 sec

内存限制: 64 MB

Steve 和Alex 每天都在为午饭吃什么而发愁,因为吃的东西实在是太多了,而且很多都特别好吃。为了解决吃什么的问题,Alex 决定每次吃饭前发布一个问卷调查,让他的好朋友选出他们今天最想吃的食物,然后Alex 会根据问卷的结果来确定吃什么

每个问卷只收集一种食物,每个食物都由一个数字num 来表示。Alex 会选出问卷中出现次数超过问卷总数一半的数字来决定今天的午饭

输入格式

单组输入,每组两行

第一行有一个整数N  (1≤N≤2×107)

第二行有N 个整数num  (num≤1018) ,代表每个问卷中的数字

输出格式

输出一个整数,即出现次数超过N2 的数

样例

Input

4
1 1 1 2

Output

1

Input

5
2 2 3 3 3

Output

3

提示

保证每组数据一定存在符合条件的数
请注意题目上的内存限制

 

两道题大致都一致,我就一起写了。今天是第五场校赛,当然是大一的。看着他们写题我也想写写试试难度。结果我随便挑的一道题就是一道坑题(就是这个F题)。我用map写的,wa了;发现数据是1e18,好,我改long long,tle,我去,无序map试试,总算是飘过了(2.7s/3s)。

然后我试着用vector写写看,mle,好我知道了,这道题根本就不能把所有数据存起来,坑!出题人给了一篇博客介绍了这种题的正解:https://www.cnblogs.com/Friends-A/p/11368412.html?tdsourcetag=s_pcqq_aiomsg

用的是摩尔投票算法,建议看一看。

下面是洛谷的代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN = 1e5 + 7;

int main()
{
    //ios::sync_with_stdio(0);
    int n, x, res, ans;
    scanf("%d", &n);
    res = ans = 0;
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &x);
        if(!res)
            ans = x;
        if(x == ans)
            res++;
        else res--;
    }
    printf("%d\n", ans);

    return 0;
}

下面是积分赛用无序map的代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define P pair<ll, ll>
const int MAXN = 1e5 + 7;
unordered_map <ll, ll> mp;

int main()
{
    ios::sync_with_stdio(0);
    ll n, x;
    cin>>n;
    for(int i = 0; i < n; i++)
    {
        cin>>x;
        mp[x]++;
    }
    unordered_map <ll, ll> :: iterator it;
    P pr;
    pr.second = 0;
    for(it = mp.begin(); it != mp.end(); it++)
    {
        if(it->second > pr.second) pr.second = it->second, pr.first = it->first;
    }
    cout<<pr.first<<endl;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值