糖果分享游戏
http://www.nowcoder.com/questionTerminal/33adf53e095440b2823a39146a285b77
原题链接:
https://www.acwing.com/problem/content/description/3429/
题意:n个学生坐成一个圆圈,每人初始有一些糖果。老师吹一次口哨,每个学生同时把ta的一半糖果给右边的学生。结束时如果有学生糖果为奇数,则补一颗。当所有学生都有相同数量的糖果时,游戏结束。模拟游戏,确定老师吹口哨的次数,和最终学生的糖果数。
输入:每一组数据先输入n,接下来的n行表示逆时针方向每个学生初始的糖果数目。
输出:两个整数,以空格隔开,分别代表老师吹口哨的次数和最终每个学生的糖果数。
//糖果分享游戏 //典型的线性数据结构 //思路:有两个经常用到的行为:(1)分享糖果(2) 判断学生拥有的糖果数量是否一致 //将这两个常用的行为封装成两个函数 //当前同学的序号是i,他下一个同学的序号是(i+1)%size//size是学生总数 #include <stdio.h> #include <iostream> #include <vector> using namespace std; //分享糖果 void ShareCandy(vector<int>& student){ int size=student.size(); int i,j; //注意分享糖果不能一个同学分给下一个同学后,下一个同学再将手中糖果的1/2分给下一个同学, //应该是所有同学将手中的糖果同时一分为二,将1/2分给下一个同学 //将所有同学手中的糖果数量一分为二 //将当前所有同学手中的糖果数量减半放进share数组里 vector<int> share(size); for(i=0;i<size;++i){ share[i]=student[i]/2; } //开始分享糖果 for(j=0;j<size;++j){ student[j]-=share[j]; student[(j+1)%size]+=share[j]; } for(i=0;i<size;++i){ if(student[i]%2==1){ student[i]++; } } } //判断每个同学手中的糖果数量是否一致 bool CheckCandy(vector<int>& student){ vector<int>::iterator it; int first=student[0]; for(it=student.begin()+1;it!=student.end();it++){ if(first!=*it){ return false; } } return true; } int main(){ int n,i;//n表示学生的数量 int turn;//游戏总轮次 while(scanf("%d",&n)!=EOF){ if(n==0){ break; } vector<int> student(n);//每个学生手中的糖果数量的动态数组 turn=0;//游戏总轮次 for(i=0;i<n;++i){ //注意:%d忽略空格和回车!!!! scanf("%d",&student[i]);//初始化所有同学手中的糖果数量 } while(CheckCandy(student)==false){ ShareCandy(student); turn++; } printf("%d %d\n",turn,student[0]); } return 0; }
王道机试指南 文章被收录于专栏
这个专栏是参考王道机试指南中相关的练习题哦