链接:https://vjudge.net/contest/163018#problem/B
题意
给n(奇数)个数,定义特殊的数为在序列中出现次数不少于(n+1)/2次的数,找出这个特殊的数
题目非常水,根本没有需要特殊考虑的情况
所以导致有好几种解法

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<algorithm>
#include<iostream>
#include<set>
using namespace std;
//这也是编程之美和啊哈算法里的一道经典面试题目
const int mmax = 600100;
const int inf = 0x3f3f3f3f;
int dp[mmax],data[mmax],da[mmax];
int n,m,k;
int main()
{
    while(cin>>n)
    {
        for(int i=1; i<=n; i++)
            scanf("%d",&data[i]);
        sort(data+1,data+1+n);
        printf("%d\n",data[(n+1)/2]);

    }

    return 0;
}
解法2int main()
{
    int n,x;
    //cin>>n;
    while(cin>>n)
    {
        int y,nn;
        nn= n;
        memset(a,0,sizeof(a));
        while(nn--)
        {

            scanf("%d",&x);
            a[x]++;
            if(a[x]>=(n+1)/2)
            {
                y = x;
            }
        }
        cout<<y<<endl;
    }
}
利用桶排序,找出出现次数大于一半的数
解法3
int a[999999];
int main()
{
    int n,x;
    //cin>>n;
    while(cin>>n)
    {
        int y,t=0;
        stack<int>o;
        while(n--)
        {

            scanf("%d",&x);
           if(o.empty()){o.push(x);}
           else if(o.top()==x){

            o.push(x);
           }
           else o.pop();
        }
        cout<<o.top()<<endl;
    }
}
也是o(n)的算法
同解法三,不过是手动模拟栈
int a[999999];
int main()
{
    int n,x;
    //cin>>n;
    while(cin>>n)
    {
        int y,t=0;


        while(n--)
        {

            scanf("%d",&x);
            if(t==0)
            {
                t++;
                y = x;
            }
            else if(x==y)t++;
            else t--;
        }
        cout<<y<<endl;
    }
}

注意以上算法只要题目稍微更改,比如 4 2 5 2 就会出错,只有桶排和第一种算法比较靠谱