蓝桥杯试题 历届试题 分糖果

  • 时间:
  • 来源:互联网
  • 文章标签:

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

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

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

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

你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
输入格式
  程序首先读入一个整数N(2<N<100),表示小朋友的人数。
  接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
输出格式
  要求程序输出一个整数,表示老师需要补发的糖果数。
样例输入
3
2 2 4
样例输出
4

我的解法

#include<iostream>
using namespace std;
int a[10000],b[10000];
int d = 0;
int count1 = 3;
int c = 0;
int check()
{
	for (int i = 0; i < count1 - 1; i++)
	{
		if (a[i] != a[i + 1])
			return 0;
		else
			continue;
	}
	return 1;
}
int main()
{
	cin >> count1;

	for (int i = 0; i < count1; i++)
	{
		cin >> a[i];
	}
	do
	{

		for (int i = 0; i < count1; i++)
		{
			b[i] = a[i] / 2;
		}

		a[count1 - 1] = a[count1 - 1] / 2 + b[0];

		for (int i = 0; i < count1-1; i++)
		{
			a[i] = a[i] / 2 + b[i + 1];
		}

		for (int i = 0; i < count1; i++)
		{
			if (a[i] % 2 != 0)
			{
				a[i]++;
				d++;
			}
		}
	} while (!check());
	cout << d;
	return 0;
}

这个题要把题意理解正确,分糖果的时候是每个人同时拿一半糖果,而不是一个人拿完再给另外一个人,另外一个人拿着这份糖果再给另一个人。

还有一点是要注意是向左,也就是从后往前加,第一个人给最后一个人加。

代码细节注意

for (int i = 0; i < count1-1; i++)
		{
			a[i] = a[i] / 2 + b[i + 1];
		}

这里的下标和循环结束条件,下标有i+1,循环往后退一个变成count-1.

同样注意数组下标与循环的结束条件
注意验证一个数组是否不等的写法

int check()
{
	for (int i = 0; i < count1 - 1; i++)
	{
		if (a[i] != a[i + 1])
			return 0;
		else
			continue;
	}
	return 1;
}

本文链接http://www.taodudu.cc/news/show-83077.html