解题思路:

将每个人糖果的一半分给下一个人,首先自然而然想到用数组记录每人的糖果数,i=1 表示从第一个开始,

其次  每人分出去一半,是同时进行,不是从一开始顺序分出一半,这是两种解法。

关于记录分出去的一半糖果数,我也是用另一个数组记录,其次就是数学与逻辑的整合啦,看代码吧!



注意事项:

此题注意理解题意要理解透彻,把过程想明白。


参考代码:

#include<stdio.h>
main()
{
     int n,i,f,m,c=0;
    int a[100],b[100];
    scanf("%d",&n);                     //输入n个人
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);             // 输入每个人的初始糖果数
    }
    while(1)
    {
        f=1;                                 // f=1,用来下面判断是否每人糖果数一致
        for(i=1;i<=n;i++)
        {
            a[i]=a[i]/2;                   //首先同时发生,先让每个人糖果数目减半
            b[i]=a[i];                      //减少的就是要分给下一个人的,用b数组记录
        }
        b[0]=b[n];                       //此处给b【0】赋予最后一个人分发的糖果数
        for(i=1;i<=n;i++)            //(i从1开始)可以使每个人得到的糖果都来源于下一个人  a[i]=a[i]+b[i-1];           

      {
            a[i]=a[i]+b[i-1];          //每一轮分糖果,每个人最后的糖果数
        }

        for(i=1;i<=n;i++)
    {
        if(a[i]%2!=0)
        {

            a[i]=a[i]+1;
            c++;                        //如果不是偶数,则c(补充的糖果数)+1
        }
    }
        for(i=1;i<n;i++)
    {
         if(a[1]!=a[i+1])
        {
           
           f=0;                  //  如果都不等于第一个人的数目,大家数目不一样,f为0,继续循环
        }
    }

    if(f==1)
    {
        break;             // 一样。则跳出while循环,输出增加糖果数目
    }
    }
    printf("%d",c);




    }



点赞(21)
 

0.0分

3 人评分

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

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

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

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

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

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

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

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

评论列表 共有 18 条评论

白的像碳 2年前 回复TA
@lqbsy 注意看题,小朋友围成一圈
lqbsy 2年前 回复TA
这个最后不相等为啥f=0啊,等于0为假,不就进不去循环了嘛,不应该是不相等让f=1嘛,好进入循环,佬
lqbsy 2年前 回复TA
佬,我没太弄懂这题的意思,如果是三个人,第一个给第二个,第二个给第三个。第三个是给第二个吗?第三个的左手边是第一个还是第二个
小姜骑猪 2年前 回复TA
int fun(int N, int a[])//判断每个小朋友的糖果是否相等
{
	for (int i = 0; i < N-1; i++)
	{
		if (a[i] != a[i + 1])
			return 0;
	}
	return 1;
}

int main()
{
	int N, a[100], b[100], i, k=0;
	scanf("%d", &N);
	for ( i = 0; i < N; i++)
	{
		scanf("%d", &a[i]);
	}
	while (!fun(N,a))//不相等进入循环
	{
	
		for (i = 0; i < N; i++)//利用两个数组,我这b[]是从1开始的,将a[]里的元素分一半给b
		{
			b[i+1] = a[i] / 2;
			a[i] = b[i+1];
		}
		for (i = 1; i < N; i++)//从第二个元素开始a,b元素一一相加
		{
			a[i] += b[i];
		}
		a[0] =a[0] + b[N];//a[0]和b[N]相加
		for (i = 0; i < N; i++)
		{
			if (a[i] % 2 != 0)//判断每个小朋友的糖果是否为偶数
			{
				a[i] += 1;
				k++;
			}
		}
20信科1丁小龙 2年前 回复TA
请问最后一个for循环为什么不用<=n啊,前面不都是小于等于吗
Spperman 5年前 回复TA
明天省赛,回来看看
Spperman 5年前 回复TA
@吃苹果红的 f==1 才退出while(1)的死循环,你的没有f=1赋值的条件,因此之后f总是0  无法break
逻辑幻象 5年前 回复TA
/* 3
2          2      4
1         1       2
1+1=2    1+2=3   2+1=3
  2       4      4  
  1       2      2
  2       2      2*/ 
#include<stdio.h>
int main(){
	int a[105];
	int n,sum=0;//标记补发的糖果 
	scanf("%d",&n);
	int i,z;
	int tag;
	for(i=0;i<n;i++){//输入每个小孩的糖果数量 
		scanf("%d",&a[i]);
	}
	while(1){//开始循环 
		tag=0;//作为标记 
		if(a[0]%2==0){
			z=a[0]/2;// Z 为第一个小孩减半后的糖果数量 
		}
		else{
			z=(a[0]+1)/2;
		}
		for(i=0;i<n;i++){
			if(a[i]%2==1){//从头至尾 糖果数若是双数则直接减半  单数就加一在减半  记入补发的数目 
				a[i]+=1;
				sum++;// 单数的情况  将补发的糖果数 记入 
			}
			a[i]/=2;
			if(a[i]!=z){
				tag=1;//若是 有小孩的糖果数不等于第一个小孩的数目  则
吃苹果红的 5年前 回复TA
while(1)
    {
        f = 1;
        for (i=n-1; i>=0; i--)
        {
            a[i] += a[(i+1)%n]/2;
            a[(i+1)%n] = (a[(i+1)%n]+1)/2;
        }
        for (i=0; i<n; i++)
        {
            if (a[i]%2 == 1)
            {
                len++;
                a[i] += 1;
            }
        }
        for(i=0;i<n-1;i++)
        {
            if(a[0]!=a[i+1])
            {
                f = 0;                 
            }
        }
        if(f==1)
        {
            break;            
        }
    }
怎么就超时了呢?
Spperman 5年前 回复TA
@王海迪 好久没看网站了,这个题我刚学的时候想啦好久,现在看着就好多了,多练习比只看书有效果,