解题思路:
       首先题目要求至少一半以上的州才能竞选成功,这里我们就直接取--(N/2+1),然后要求一半一以上的选民投票才能竞选成功,题目问至少需要多少选票,这里就需要我们将N个州的选民数进行升序排列,去前面的---(N/2+1)个州,每个州取---(a[i]/2+1);因此需要一个升序排列函数,这里我用了两种方法来写;


注意事项:

      第一种方法我的升序排列函数里面的for循环要注意,这里是用的冒泡方法,一开始我的值没取对,排序出来的结果老是有0值;

for(i=0;i<n;i++)
    {
        for(j=0;j<=n-i-2;j++)//这里的条件要搞清楚
        {
            if(a[j]>a[j+1])
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }

在我的第一种方法中,我一开始很蠢的,也是很直观的看到州的个数好像有奇偶之分,于是我在计算投票总数的时候考虑到了这个;但是这对最终的结果没有影响,系统还是AC了;

int sum=0;
    if(n%2!=0){
    for(i=0;i<(n+1)/2;i++)
    {
        sum=sum+(a[i]/2+1);
    }
    printf("%d\n",sum);
    }
    else if(n%2==0){
        for(i=0;i<(n/2+1);i++)
        {
            sum=sum+(a[i]/2+1);
        }
        printf("%d\n",sum);
    }

在第二种方法中,直接用了指针的方法,进行数组比较,代码很简洁明了;

int cmp(const void *a,const void *b)
{
    return *(int*)a-*(int*)b;//大于返回1,等于返回0,小于返回-1;
}

在后面的main函数中我也优化了州的取法,直接用---(N/2+1)后面的代码优化了;


参考代码:

 第一种方法:

void ascending(int n)//复杂的升序排列;
{
    int a[101];
    int i,j,k;
    int temp;
   // scanf("%d",&n);
    for(k=0;k<n;k++)
    {
        scanf("%d",&a[k]);
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<=n-i-2;j++)
        {
            if(a[j]>a[j+1])
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
    int sum=0;
    if(n%2!=0){
    for(i=0;i<(n+1)/2;i++)
    {
        sum=sum+(a[i]/2+1);
      //  printf("%d ",a[i]);
    }
    printf("%d\n",sum);
    }
    else if(n%2==0){
        for(i=0;i<(n/2+1);i++)
        {
            sum=sum+(a[i]/2+1);
        }
        printf("%d\n",sum);
    }

}
//核心函数
void  total(int n)
{
    int i,sum=0;
    int a[101];
    if(n<=2)
    {
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            sum=sum+(a[i]/2+1);
        }
        printf("%d\n",sum);
    }
    else if(n%2==0)
    {
        ascending(n);//进行升序排列,取前面(n/2+1)个州,然后将这些州的人数除以2再加一求总和就可以;
    }
    else if(n%2!=0)
    {
        ascending(n);//进行升序排列,取(n+1/2)个州,然后将这些州的人数除以2再加一求总和就可以了;
    }
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)//州的总数,输入的值为-1时则跳出循环
    {
        if(n==0) break;
        else
        {
           total(n);
        }
    }
    return 0;
}

第二种方法:

int cmp(const void *a,const void *b)//数组比较函数
{
    return *(int*)a-*(int*)b;
}
int main()
{
    int N,i;
    while(scanf("%d",&N)!=EOF&&N!=0)
    {
        int a[N];
        for(i=0;i<N;i++)
        {
            scanf("%d",&a[i]);
        }
        qsort(a,N,sizeof(int),cmp);
        N=N/2+1;
        int sum=0;
        for(i=0;i<N;i++)
        {
            sum+=a[i]/2+1;
        }
        printf("%d\n",sum);
    }
    return 0;
}

如果大家有什么想指正的,欢迎留言,谢谢!

我也是小白一枚哦!

点赞(4)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论