主元素法

一、前言

问题描述:问有n个人发出了n张投票,问是否能投票出某个人当选主席,当然当选主席不是那么容易的必须要保证那个人的得票严格大于总投票数的一半

二、问题分析

如果一个元素严格大于总元素的一半,那么经过抵消过后,必然最后剩下的还是那个元素,则这个元素我们称之为主元素,这种方法的确定是不能够判断是否存在主元素,所以我们抵消求出主元素之后我们还需要判断这组元素是否存在主元素。

三、代码

#include <stdio.h>
#include <stdlib.h>
int judge_prime(int *a,int val,int n)
{
    int i=0;
    int count=0;
    for(i=0;i<n;i++)
        if(a[i]==val)
            count++;
    if(count>n/2)
        return 1;
    return 0;
}
int main()
{
    int n;
    int *a=NULL;
    int val,count=0;
    int temp,z=0;
    int flag;
    printf("Please input nums(n):");
    scanf("%d",&n);
    a=(int *)malloc(sizeof(int)*n);
    while(n--)//抵消法无法判断是否存在主元素
    {
        scanf("%d",&temp);
        a[z++]=temp;
        if(count==0)
            val=temp;
        if(temp==val)
            count++;
        else
            count--;//进行抵消元素
    }
    flag=judge_prime(a,val,z);//判断是否存在主元素
    if(count>0&&flag)
        printf("%d",val);
    else
        printf("-1");//表示不存在主元素
}

 

posted @ 2021-12-27 22:18  scannerkk  阅读(84)  评论(0)    收藏  举报