分糖果-蓝桥杯历届试题

题目描述

有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 
每个小朋友都把自己的糖果分一半给左手边的孩子。 
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。 
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。 
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。 

输入

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

输出

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

样例输入

3 
2  2  4 

样例输出

4 
解题思路:将小朋友坐在一圈,这样分发糖果就方便了。因此循环链表呼之欲出。为了迎合向左传递,建立链表的时候,采用头插入就行。代码如下:
#include <iostream>
using namespace std;
struct people
{
    int value;
    people*next;
    int add;
    people(int num)
    {
        value=num;
        add=0;
        next=NULL;
    }
};
int main()
{
    int n;
    cin>>n;
    int num;
    cin>>num;
    people *head = new people(num);
    
    people *tail = head;
    for (int i=1; i<n; i++)
    {
        cin>>num;
        people *temp = new people(num);
        temp->next = head;
        
        head=temp;
    }
    tail->next = head;
    
    people * h = tail;
    int counter = 0;
    while (1) {
        h=tail;
        for (int i=0; i<n; i++) {
            h->next->add = h->value/2;
            h->value = h->value/2;
            h=h->next;
        }
        h=tail;
        for (int i=0; i<n; i++) {
            if ((h->value+h->add)%2!=0) {
                counter++;
                h->value += h->add+1;
                h->add=0;
            }
            else
            {
                h->value += h->add;
                h->add=0;
            }
            h=h->next;
        }
        
        h=tail;
        bool flag = true;
        for (int i=0; i<n; i++) {
            if (h->value!=h->next->value) {
                flag = false;
            }
            h=h->next;
        }
        if (flag) {
            break;
        }
    }
    cout<<counter<<endl;
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值