2017/10/6 x中培训-------谁是组长

谁是组长 (来自X中的题目)

(File IO): input:leader.in output:leader.out
时间限制: 1000 ms 空间限制: 65536 KB 具体限制
题目描述
x中信息组需要选一个组长。信息组一共有n个人,分别用1到n编号,其中m个人参与了投票。得票数过半
(票数大于m div 2)的人将被选为组长。
输入数据将告知这m个人分别将票投给了谁,请统计出谁将担任一中信息组的组长。

输入

第一行两个数n和m。
第二行有m个数,这些数都是不超过n的正整数,表明这m个人的选择。

输出

输出将被选为组长的人。如果没有人的票数过半,请输出-1。

样例输入

7 4
7 7 2 7

样例输出

7

数据范围限制

20%数据满足: n,m<=10
40%数据满足: n<=10,m<=10000
100%数据满足: 1<=n<=maxlongint,1<=m<=10000

PS:注意空间控制。

 

这题一时只会写暴力,后面又想到伪hash看看测评点水不水,结果数据好水,竟然让我AC了。。。

暴力:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 0xffff
using namespace std;
long int n,y,a[N];
int m;
int main()
{
	//freopen("leader.in","r",stdin);
	//freopen("leader.out","w",stdout);
	int i,j;
	cin>>n>>m;	y=m/2;
	for(i=1;i<=m;i++)
	{ scanf("%d",&j); a[j]++;
	if(a[j]>y) { cout<<j; return 0;} }
	cout<<-1;
	return 0;
}


//50分

伪hash:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 233329
using namespace std;
long int n,y=0,a[N+1]={0};
int m;
int main()
{
    //freopen("leader.in","r",stdin);
    //freopen("leader.out","w",stdout);
     int i,j;
     cin>>n>>m;
     for(i=1;i<=m;i++)
     { scanf("%d",&j);
     a[j%233329]++;
     if(a[j%233329]>m/2)
     y=j;}
 if(y==0)
   cout<<-1;
 else
 cout<<y;
 return 0;
}

//100分

正解:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,a[10002],sum;
bool b[10002],d;
int main()
{
	freopen("leader.in","r",stdin);
	freopen("leader.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	scanf("%d",&a[i]);
	for(int i=1;i<=m/2+1;i++)
	if(!b[i])
	{
		sum=1;
		for(int j=i+1;j<=m;j++)
		if(a[i]==a[j])
		{
			sum++;
			b[j]=true;
		}
		if(sum>m/2)
		{
			d=true;
			printf("%d",a[i]);
			break;
		}
	}
	if(!d)printf("-1");
	return 0;
}
posted @ 2017-10-06 19:10  sanqiz  阅读(293)  评论(0)    收藏  举报