蓝桥杯 1431 分糖果 (找规律)

题目描述

问题描述

有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:

每个小朋友都把自己的糖果分一半给左手边的孩子。

一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。

反复进行这个游戏,直到所有小朋友的糖果数都相同为止。

你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。

输入

程序首先读入一个整数N(2< N< 100),表示小朋友的人数。

接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)

输出

要求程序输出一个整数,表示老师需要补发的糖果数。

样例输入

3

2 2 4

样例输出

4

分析:

我们的任务就是要把当前数(必须为偶数)除半后加上他后面的那个数(必须为偶数)的一半,如果说最后一个数的话,加上的应该是第一个数,相当于一个循环的数组知道数组中的所有的数全部相等为止。

但是我们要注意的是,第一个数是第一个变换的,当我们进行到最后一个数的时候第一个数的值已将改变了,而我们要加上的是没有变换之前的第一个数。所以最后一个数要单独处理。

代码:

    #include <iostream>
    #include <stdio.h>
    #include <cstring>
    using namespace std;
    int main()
    {
        int n;
        int a[101];
        int i,sum=0,op;
    	scanf("%d",&n);
    	for( i=0;i<n;i++)
    	   scanf("%d",&a[i]);
    	while(1)
    	{
    	 //首先应该判断当前数组中的元素是否完全相等,完全相等就直接输出老师补发的糖果个数,否则的话就要接着进行 
    	 op=a[0];//都与第一位进行比较 
    	 for( i=1;i<n;i++)
    	 {
    	   if(a[i]!=op)
    	   {
    	   	break;
    	   }	
    	 }
    	 if(i==n)//中间没有break,相当于所有的数全部相等 
    	   {
    	   	printf("%d",sum);
    	   	break;
    	   }
    	  //如果当前的数组中有奇数,则加1变为偶数,老师步伐的糖果数加1 
    	  for(i=0;i<n;i++)
    	 	 {
    	 	 	if(a[i]%2!=0)
    	 	 	{
    			  a[i]=a[i]+1;
    	 	 	  sum++;
    	 	 	}	 	
    	 	 }
    	 	 op=a[0];//要先把没有变换前的a[0]的值取出来,否则后面就变了 
    	 	for( i=0;i<n-1;i++)
    	 	 {
    	 	 	a[i]=a[i]/2+a[i+1]/2;
    	 	 }
    	 	a[n-1]=a[n-1]/2+op/2;//最后一个人应该是第一个人给他	  
    	}
       
        return 0;
    }
原文地址:https://www.cnblogs.com/cmmdc/p/6729623.html