当前位置: 代码迷 >> 综合 >> 蓝桥杯 PREV-32 分糖果(试题解析)
  详细解决方案

蓝桥杯 PREV-32 分糖果(试题解析)

热度:10   发布时间:2024-01-21 20:13:25.0

试题 历届试题 分糖果

提交此题   评测记录  

资源限制

时间限制:1.0s   内存限制:256.0MB

问题描述

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

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

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

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

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

输入格式

  程序首先读入一个整数N(2<N<100),表示小朋友的人数。
  接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)

输出格式

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

样例输入

3
2 2 4

样例输出

4

题目不难,关键是要晓得用中间量作为增量序列

 

代码如下:

#include <iostream>

using namespace std;

bool checkEqual(int arr[],int n){
    bool isEqual=true;
    int flag=arr[0];
    for(int i=1;i<n;i++){
        if(arr[i]!=flag){
            isEqual=false;
            break;
        }
    }
    return isEqual;
    
}

void addCandy(int arr[],int n){
    int addSum=0;
    int  incr[n];
    while(1){
        if( checkEqual(arr,n) ){
            break;
        }
        for(int i=0;i<n;i++){
            incr[i]=arr[ (i+1)%n ]/2;    //更新增量序列 
        }
        
        for(int i=0;i<n;i++){
            arr[i]=arr[i]-incr[(n+i-1)%n]+incr[i];    //给每个元素减去 输出的 加上 对应的增量序列 
        }
        
        for(int i=0;i<n;i++){
            if(arr[i]%2!=0){//若为奇数 
                arr[i]++;
                addSum++;
            }
        }
    }
    
    cout<<addSum<<endl;
    
}

int main(int argc, char** argv) {
    int n;
    cin>>n;
    int arr[n];
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
    addCandy( arr,n);
        

    return 0;
}