【bzoj2456】mode (如何查找数列中超过一半的数)

Q:给你一串数,问你串中出现次数超过一半的数是什么?

方法一:

当然是暴力啦,开一个数组记录每一个数出现了多少次,然后找数组中数值大于 n / 2 的数,开心的话还可以离散化一下喽。

方法二:

从现在开始我们要利用这一串数的性质了,如果一个数出现的次数超过了一半,那么我们如果吧这个数列进行排序,然后显然中间的数就是我们要找的数啦。

方法三:

这是最巧妙的一个办法:

我们现在定义一个数 j ,并且记录暂时的答案。

我们每次读入一个数,如果 j 是0,就把当前答案改成这个数。

如果当前的答案等于新读入的数,那么 j + + 。

如果当前的答案不等于新读入的数,那么 j - - 。

练习:

bzoj 2456

代码:

ps:用iostream会mle,玄学qwq

 1 #include<stdio.h>
 2 int main(){
 3     int n,a,j=0,ans;
 4     scanf("%d",&n);
 5     for(;n;n--){
 6         scanf("%d",&a);
 7         if(j==0){
 8             ans=a;
 9             j++;
10         }
11         else {
12             if(a!=ans){
13                 j--;
14             }
15             else j++;
16         }
17     }
18     printf("%d\n",ans);
19 }

猜你喜欢

转载自www.cnblogs.com/Fang-Hao/p/9048907.html
今日推荐