您的位置:首页 > 编程语言 > C语言/C++

分糖果 蓝桥杯

2016-03-17 11:29 399 查看
问题描述
  有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:

  每个小朋友都把自己的糖果分一半给左手边的孩子。

  一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。

  反复进行这个游戏,直到所有小朋友的糖果数都相同为止。

  你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。

输入格式

  程序首先读入一个整数N(2<N<100),表示小朋友的人数。

  接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)

输出格式

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

样例输入

3

2 2 4

样例输出

4

思路
根据题意,比较短路的采用模拟的算法。
数据结构:N个大小的int数组
算法:
           children[i]/2    children[(i+1)%N]+=children/2
           相等标志=true            
           遍历,遇到奇数则其+1,计数器+1,偶数不变。
           和第一个数比较,相等标志值遇到不同变false。
           until(!相等标志值)
输出:计数器

误区:分一半是指原来的数目的一半,而不是接受了右手边的再分。否则,可能出现奇数就没办法分一半了。比如2 2 4 -> 1 3 4。
应该先都分一半,再一次性加上。2 2 4 -> 1 1 2。或者让最后一个孩子先分,但不给出去,然后这个孩子之前的人分给他,直到最后再将他的分给第一个人。

代码

#include<iostream>
using namespace std;
int main(){
int N;
cin >> N;
int *child = new int
;
for(int i=0;i<N;++i){
cin >> child[i];
}
int candys = 0,i,temp;
bool isEq = false;
while(!isEq){
// divide candy
for(i=N-1;i>=0;--i){
if(i == (N-1)){
temp = child[i]/2;
child[i] = temp;
}else{
child[i]/=2;
child[i+1]+=child[i];
}
}
child[0] += temp;
isEq = true;
// send candy
for(i=0;i<N && isEq;++i){
if(child[i]%2==1){
child[i] += 1;
candys += 1;
}
}
for(i=0;i<N && isEq;++i){
if(child[i] != child[0]){
isEq = false;
}
}
}
cout << candys;
delete child;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++