阿伦


私信TA

用户名:874501825

访问量:17187

签 名:

等  级
排  名 1100
经  验 3087
参赛次数 3
文章发表 7
年  龄 0
在职情况 学生
学  校 汕头大学
专  业

  自我简介:

TA的其他文章

解题思路:
       首先题目要求至少一半以上的州才能竞选成功,这里我们就直接取--(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;
}

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

我也是小白一枚哦!

 

0.0分

2 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区