八中信息组需要选一个组长。信息组一共有n个人,分别用1到n编号,其中m个人参与了投票。得票数过半(票数大于m div 2)的人将被选为组长。
输入数据将告知这m个人分别将票投给了谁,请统计出谁将担任八中信息组的组长。
输入格式 第一行两个数n和m。
第二行有m个数,这些数都是不超过n的正整数,表明这m个人的选择。
输出格式 输出将被选为组长的人。如果没有人的票数过半,请输出-1。
输入样例 7 4 7 7 2 7 输出样例 7
方法一:
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
long int n; //为保险,不超出范围
int m=0;//n个人,m个人投票
int b[10000]={0};
int o=0; //某个人的投票数
int flag=0; //是否存在符合标准的人
scanf("%ld%d",&n,&m);
for(int i=0;i<m;i++)
{scanf("%d",&b[i]);
}
if(n==1&&m==1)
{printf("1");
} //特殊情况,单独列出一种情况
else{
for(int i=0;i<m;i++)
{for(int j=0;j<m-i-1;j++)
{
if(b[j]>b[j+1])
{int t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
}//投票冒泡;
for(int j=0;j<m/2+1;j++) //减少次数
{
if(b[j]==b[j+1])
{o=0;//归零
int k=0;
for(k=j;k<m;k++)
{
if(b[k]==b[k+1])
{o=o+1;}//累计某个人有多少票
else break;
}
if(o+1>m/2)
{ printf("%d",b[k]);
flag=1;
break;}
}
if(flag==1) break;
}
if(o<m/2)
printf("-1");
}
return 0;
}
主要思想是:用一个数组把所有投票结果存起来,再冒泡排序,最后从头开始扫一遍,看是否有符合要求的人,但很容易超时,可以引入快排函数qsort对数组进行排序,改进版如下:
方法二:
#include <iostream>
#include <stdio.h>
using namespace std;
int cmp ( const void *a , const void *b ) {
return *(int *)a - *(int *)b;
}
int main()
{
long int n; //为保险,不超出范围
int m=0;//n个人,m个人投票
int b[10000]={0};
int o=0; //某个人的投票数
int flag=0; //是否存在符合标准的人
scanf("%ld%d",&n,&m);
for(int i=0;i<m;i++)
{scanf("%d",&b[i]);
}
if(n==1&&m==1)
{printf("1");
} //特殊情况,单独列出一种情况
else{
qsort(b,m,sizeof(int),cmp);
for(int j=0;j<m/2+1;j++) //减少次数
{
if(b[j]==b[j+1])
{o=0;//归零
int k=0;
for(k=j;k<m;k++)
{
if(b[k]==b[k+1])
{o=o+1;}//累计某个人有多少票
else break;
}
if(o+1>m/2)
{ printf("%d",b[k]);
flag=1;
break;}
}
if(flag==1) break;
}
if(o<m/2)
printf("-1");
}
return 0;
}