题干:

描述

 

给你一个数组,输出里面出现超过1/2的元素。保证有且只有一个解。

输入

第一行是一个整数,表示测试数据的组数 n,n < 1000万 之后每一行都是一个整数。

输出

输出出现超过1/2的那个数字。

输入样例 1 

5
1
1
1
2
3

输出样例 1

1

提示

  • 不要使用 cin,测试数据很大。
  • 将时间复杂度降到 O(n)

解题报告:

 

AC代码:(三种)

#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<iostream>
#include<algorithm>
#define ll long long
#pragma GCC optimize(2)
const ll mod = 1e9+7;
using namespace std;
int n;
ll a[10000000 +5];
int main()
{
	int n,res;
	ll tmp;
	scanf("%d",&n);
	res = n/2+1;
	for(int i = 1; i<=n; i++) {
		scanf("%lld",&a[i]);
	}
	sort(a+1,a+n+1);
	printf("%lld",a[res]);
	
	
	return 0 ;
}
//#include<cstdio>
//#include<queue>
//#include<cstring>
//#include<cmath>
//#include<map>
//#include<iostream>
//#include<algorithm>
//#define ll long long
//const ll mod = 1e9+7;
//using namespace std;
//int n;
//ll a[10000000 +5];
//map<ll,int> mp;
//int main()
//{
//	int n,res;
//	ll tmp;
//	scanf("%d",&n);
//	res = n/2+1;
//	for(int i = 1; i<=n; i++) {
//		scanf("%lld",&tmp);
//		mp[tmp]++;
//	}
//	map<ll,int> :: iterator it;
//	for(it = mp.begin(); it!=mp.end(); ++it) {
//		if(it->second >= res) printf("%lld\n",it->first);
//	}
//	
//	return 0 ;
//}
//
//#include<bits/stdc++.h>
//using namespace std;
//int main()
//{
//    int n;
//    scanf("%d",&n);
//    int temp,time=0,a;
//    for(int i=0;i<n;i++)
//    {
//        scanf("%d",&a);
//        if(time==0)
//        {
//            time=1;
//            temp=a;
//        }
//        else if(temp==a)
//        {
//            time++;
//        }
//        else
//        {
//            time--;
//        }
//    }
//    printf("%d\n",temp);
//}