糖果分享游戏

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;
} 


王道机试指南 文章被收录于专栏

这个专栏是参考王道机试指南中相关的练习题哦

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务