2018蓝桥杯|历届试题|分糖果
问题描述
有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
输入格式
程序首先读入一个整数N(2<N<100),表示小朋友的人数。 接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
输出格式
要求程序输出一个整数,表示老师需要补发的糖果数。
样例输入
3 2 2 4
样例输出
4
我的答案:
1 #include<iostream> 2 using namespace std; 3 bool compare(int *a,int num){ 4 for(int i=0;i<num;i++){ 5 if(a[i]!=a[0]) return false; 6 } 7 return true; 8 } 9 bool issingle(int b){ 10 return b%2==1?1:0; 11 } 12 int main(){ 13 int pupil; 14 cin>>pupil; 15 int *candy=new int[pupil];//candy不能是[]只能是* 16 for(int i=0;i<pupil;i++){ 17 cin>>candy[i]; 18 } 19 int number=0; 20 while(!compare(candy,pupil)){ 21 int first =candy[0] ;// 22 for(int i=0;i<pupil-1;i++){// 这里没想到 23 candy[i]=(candy[i]+candy[i+1])/2;// 24 } 25 candy[pupil-1]=(candy[pupil-1]+first)/2;// 26 27 for(int i=0;i<pupil;i++){ 28 if(issingle(candy[i])) {candy[i]++;number++;} 29 } 30 } 31 cout<<number; 32 delete []candy; 33 }
思路:程序按照题目的思路写。将每个小朋友的糖果定义为一个数组。数组值就是糖果数。用一个while循环在控制整个程序的执行。我把判断数组中每个元素是否都相等和判断是否为奇数分别写成了布尔类型的函数,看起来比较方便。
出现的问题和卡住的地方:在对题意的理解上,“每个小朋友都把自己的糖果分一半给左手边的孩子”这句话有一点语义模糊,有两种理解:一种是每个小朋友同时把自己的一半分给左边的小朋友(同时 即 把自己原有的一半分走),另一种是每个小朋友依次把自己的一半分给左边的小朋友(依次 即 把自己的和右边给自己的合起来一半分走)。验证发现,前一种是正确的。但是如何写程序能保证每个元素都能保存住初始值呢?在这里我没有想明白,然后到CSDN社区借鉴了http://blog.csdn.net/qianchangdiyin/article/details/44809597的思路 21-25行。 其次,我读题有误,开始我以为要输出的是进行几轮,后来答案一直不对。重新读题发现输出的应该是老师补发的糖果数。