您的位置:首页 > 编程语言 > C语言/C++

Tyvj P3680 找妹子

2016-09-24 10:40 134 查看


背景

本题由 @fjzzq2002 提供,已奖励20金币。


描述

sps是zzq的好伙伴。

sps一天叫来了许多个妹子。然后sps看了看这些妹子,说了m个数。这m个数中出现次数最多的数就是sps最喜欢的妹子的编号。因为sps非常专一,他最喜欢的妹子的编号出现的次数大于m的一半。

你自然想知道一下sps最喜欢哪个妹子。

m<=1000000。m个数均在int范围内的正数。

注意看时空限制!


输入格式

第一行一个数m。

第二行m个数。


输出格式

输出出现次数最多的数。


备注

空间1.2MB,连m个数都存不下。

样例输入:

8

2 3 3 2 3 3 2 3

样例输出:

3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

神奇神奇又神奇的贪心~

因为题目里面说连m个数都存不下,当然不能用数组了,只能即时更新。

用两个变量t和k记录,k为当前出现次数最多的妹子,t记录的是k比其他人中最大的大了多少。

然后每次如果出现的是k,就t++;出现的不是k,就t--;如果t==-1,表示有妹子比现在的妹子还厉害,就更新k值;这里要注意应该再把t值赋值为1~

证明:

如果上一步是k还是最大的,而这一步的时候输入的x使得k不再优越,那么此时的x一定是最优解,因为如果前面有一个kkz出现次数比x多,那么kkz一定会先于x更新k值,就不会等到x来更新k了。

#include<cstdio>

int n,t,x,k;

int main()
{
scanf("%d%d",&n,&k);t=1;
for(int i=2;i<=n;i++)
{
scanf("%d",&x);
if(x==k) t++;
else
{
t--;
if(t==-1) t=1,k=x;
}
}
printf("%d\n",k);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 贪心 思路