题目背景
自动上次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;
}