如何查网站建设者ip,图片编辑器在线,北京社保网站减员怎么做,陕西建设厅官网糖果分享游戏
一些学生围坐一圈#xff0c;中间站着他们的老师#xff0c;所有人都面向老师。 他们要玩一个有关糖果分享的游戏。每个学生最开始都有一定数量的糖果#xff08;保证一定是偶数#xff09;。 每轮游戏的进程为#xff1a;
老师吹起哨声#xff0c;所有学…糖果分享游戏
一些学生围坐一圈中间站着他们的老师所有人都面向老师。 他们要玩一个有关糖果分享的游戏。每个学生最开始都有一定数量的糖果保证一定是偶数。 每轮游戏的进程为
老师吹起哨声所有学生同时拿出自己一半数量的糖果递给右边相邻的同学。
传递完成后所有拥有奇数数量糖果的同学都将再得到一颗糖果。游戏将不断进行直到所有学生拥有的糖果数量均相等为止。
现在给定所有学生的初始糖果数量请确定游戏进行的总轮次数以及游戏结束后每个学生的糖果数量。 输入格式
输入可能包含多组数据。 每组数据第一行包含整数 N表示学生数量。 接下来 N行以逆时针方向描述每个学生的初始糖果数量每行包含一个整数。当输入一行 N0时表示输入结束。 输出格式
每组数据输出一个结果占一行。
首先输出游戏总轮次然后输出游戏结束后每个人的糖果数量。 游戏一定会在有限轮次内结束原因如下
设每轮游戏开始前拥有最多糖果的人的糖果数量为 max拥有最少糖果的人的糖果数量为 min那么
每轮过后max的值都不会增加。每轮过后min的值都不会减少。某轮开始前拥有糖果数量大于 min的所有人在该轮结束后拥有的糖果数量也一定大于该轮开始前的 min。某轮开始前如果 min和 max 不相等那么至少一个拥有 min个糖果的人在该轮结束后拥有糖果数量会增加。数据范围 1≤N≤100,每个学生的初始糖果数量不超过 100且一定是偶数。 每个输入最多包含 100 组数据。
用vector进行记录每个小朋友的糖果数量 逆时针方向vector[0] vector[1] …vector[n-1] 每次游戏进行时 改变vector 变成自己的二分之一加左边的二分之一 再判断是否奇数 奇数再加一颗糖果 直到所有人拥有的糖果数量相同 i 右手边 是i1%size 两个步骤 分享糖果 检查是否相等 写成两个函数
#include iostream
#include vector
using namespace std;
//
void game(vectorint vec){int sizevec.size();//分糖果的时候不能先分第一个再分第二个 是同时分vectorint share(size);//保存再交换之前糖果数量的一半for(int i0;isize;i){share[i]vec[i]/2;}for(int i0;isize;i){vec[i]-share[i];vec[(i1)%size]share[i];}for(int i0;isize;i){if(vec[i]%2!0){vec[i]1;}}
}
bool CheckCandy(vectorint vec1){//判断所有同学糖果数量是否相等int sizevec1.size();int firstvec1[0];for(int i1;isize;i){if(first!vec1[i]){return false;}}return true;
}
int main(){int n;while(scanf(%d,n)!EOF){if(n0){break;}vectorint vec1(n);//初始化vec1 总共n个小朋友for(int i0;in;i){scanf(%d,vec1[i]);}//小朋友的糖果初始化好了//开始游戏 怎么判断游戏结束 计算游戏的次数int trun0;while(CheckCandy(vec1) false){game(vec1);trun;}printf(%d %d\n,trun,vec1[0]);}}要注意小朋友围成一圈怎么处理 按照逆时针编号方向增大 小朋友逆时针传递 编号大的接收编号小的传来的一半 对0进行特殊处理