Samsara的小组需要选出一个组长。组内一共有n(不包括Samsara)个组长候选人,分别用1至n编号,小组m个人参与了投票,得票数最多的人将被选为组长。(如果出现得票数相同得情况,则选择编号最小的那个人)
Input
输入包含若干组数据,每组数据都有两行,第一行两个正整数n(1<=n<=10000)、m(1<=m<=100000),中间以空格隔开。第二行有用空格分隔的m个数a_1...a_i...a_m(1<=a_i<=n)表示第i个人投了编号为a_i的人一票。
读入以EOF结束。
Output
输出对应也有若干行,请输出组长的编号。
Sample Input
7 4
7 7 2 7
5 5
2 2 3 4 5
Sample Output
7
下面是我写的代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int p[10001]={0};
int i,max=0,man=1,k;
for(i=0;i<m;i++)
{
cin>>k;
p[k-1]++;
}
for(i=0;i<m;i++)
{
if(p[i]>max)
{
max=p[i];
man=i+1;
}
if(max>m/2+1) break;
}
cout<<man<<endl;
}
return 0;
}
超时了,还换了几次其他的一些方案也超时了,求大神们帮忙给出优化方案ac,小渣渣万分感谢
3 个解决方案
#1
你的代码有问题,while里,第二个for里的m应该是n
#2
确实第二个循环应该是对n循环,而且:
1 max只要记住得票数最多者的下标就可以了,没必要赋两次值
2 if(max>m/2+1) break;这句没必要,因为如果没有人得票数超过一半,那这个语句就执行了n次。
1 max只要记住得票数最多者的下标就可以了,没必要赋两次值
2 if(max>m/2+1) break;这句没必要,因为如果没有人得票数超过一半,那这个语句就执行了n次。
#3
一份代码,你试下能不能过,能过在解释。。。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N = 1e+4 + 7;
int score[N];
int main()
{
int n, m;
while (~scanf("%d%d", &n, &m))
{
memset(score, 0, sizeof(int) * (n + 1));
for (int i = 0; i < m; ++i)
{
int v;
scanf("%d", &v);
++score[v];
}
printf("%d\n", max_element(score, score + n + 1) - score);
}
return 0;
}
#1
你的代码有问题,while里,第二个for里的m应该是n
#2
确实第二个循环应该是对n循环,而且:
1 max只要记住得票数最多者的下标就可以了,没必要赋两次值
2 if(max>m/2+1) break;这句没必要,因为如果没有人得票数超过一半,那这个语句就执行了n次。
1 max只要记住得票数最多者的下标就可以了,没必要赋两次值
2 if(max>m/2+1) break;这句没必要,因为如果没有人得票数超过一半,那这个语句就执行了n次。
#3
一份代码,你试下能不能过,能过在解释。。。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N = 1e+4 + 7;
int score[N];
int main()
{
int n, m;
while (~scanf("%d%d", &n, &m))
{
memset(score, 0, sizeof(int) * (n + 1));
for (int i = 0; i < m; ++i)
{
int v;
scanf("%d", &v);
++score[v];
}
printf("%d\n", max_element(score, score + n + 1) - score);
}
return 0;
}