考研机试 糖果分享游戏

糖果分享游戏

一些学生围坐一圈,中间站着他们的老师,所有人都面向老师。
他们要玩一个有关糖果分享的游戏。每个学生最开始都有一定数量的糖果(保证一定是偶数)。
每轮游戏的进程为:

老师吹起哨声,所有学生同时拿出自己一半数量的糖果,递给右边相邻的同学。
传递完成后,所有拥有奇数数量糖果的同学都将再得到一颗糖果。

游戏将不断进行,直到所有学生拥有的糖果数量均相等为止。

现在,给定所有学生的初始糖果数量,请确定游戏进行的总轮次数以及游戏结束后每个学生的糖果数量。
输入格式

输入可能包含多组数据。
每组数据第一行包含整数 N,表示学生数量。
接下来 N行,以逆时针方向描述每个学生的初始糖果数量,每行包含一个整数。当输入一行 N=0时,表示输入结束。
输出格式

每组数据输出一个结果,占一行。

首先输出游戏总轮次,然后输出游戏结束后每个人的糖果数量。
游戏一定会在有限轮次内结束,原因如下:

设每轮游戏开始前,拥有最多糖果的人的糖果数量为 max,拥有最少糖果的人的糖果数量为 min,那么:

每轮过后,max的值都不会增加。每轮过后,min的值都不会减少。某轮开始前,拥有糖果数量大于 min的所有人在该轮结束后,拥有的糖果数量也一定大于该轮开始前的 min。某轮开始前,如果 min和 max 不相等,那么至少一个拥有 min个糖果的人在该轮结束后,拥有糖果数量会增加。

数据范围
1≤N≤100,每个学生的初始糖果数量不超过 100,且一定是偶数。
每个输入最多包含 100 组数据。

用vector进行记录每个小朋友的糖果数量
逆时针方向vector[0] vector[1] …vector[n-1]
每次游戏进行时 改变vector 变成自己的二分之一加左边的二分之一 再判断是否奇数 奇数再加一颗糖果
直到所有人拥有的糖果数量相同
i 右手边 是(i+1)%size
两个步骤 分享糖果 检查是否相等 写成两个函数

#include 
#include 
using namespace std;
//
void game(vector<int> &vec){
    int size=vec.size();
    //分糖果的时候不能先分第一个再分第二个 是同时分
    vector<int> share(size);//保存再交换之前糖果数量的一半
    for(int i=0;i<size;++i){
        share[i]=vec[i]/2;
    }
    for(int i=0;i<size;++i){
        vec[i]-=share[i];
        vec[(i+1)%size]+=share[i];
    }
    for(int i=0;i<size;++i){
        if(vec[i]%2!=0){
            vec[i]+=1;
        }
    }
}
bool CheckCandy(vector<int> &vec1){
    //判断所有同学糖果数量是否相等
    int size=vec1.size();
    int first=vec1[0];
    for(int i=1;i<size;++i){
        if(first!=vec1[i]){
            return false;
        }
    }return true;
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n==0){
            break;
        }
        vector<int> vec1(n);//初始化vec1 总共n个小朋友
        for(int i=0;i<n;++i){
            scanf("%d",&vec1[i]);
        }//小朋友的糖果初始化好了
        //开始游戏 怎么判断游戏结束 计算游戏的次数
        int trun=0;
        while(CheckCandy(vec1)== false){
            game(vec1);
            ++trun;
        }
        printf("%d %d\n",trun,vec1[0]);

    }

}

要注意小朋友围成一圈怎么处理
按照逆时针编号方向增大 小朋友逆时针传递 编号大的接收编号小的传来的一半 对0进行特殊处理

你可能感兴趣的:(算法,数据结构,c++,考研)