0
点赞
收藏
分享

微信扫一扫

分糖果【第五届】【省赛】【B组】 C++解法

余寿 2022-03-26 阅读 51

资源限制

时间限制:1.0s 内存限制:256.0MB

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

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

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

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

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

格式要求

  程序首先读入一个整数N(2<N<100),表示小朋友的人数。
  接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
  要求程序输出一个整数,表示老师需要补发的糖果数。

  例如:输入
  3
  2 2 4
  程序应该输出:
  4

  资源约定:
  峰值内存消耗(含虚拟机) < 256M
  CPU消耗 < 1000ms


  请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

  所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
  注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
  注意:主类的名字必须是:Main,否则按无效代码处理。

思路:开一个数组进行计算 i 位置的小朋友经过收到及分给糖果后自己的糖果数。对于题目中的每个小朋友都把自己的糖果分一半给左手边的孩子 这里小朋友所分发出去的糖果数是在收到其他小朋友给的糖果数之前的总糖果数的一半。注意:最后一个小朋友收到的糖果是第一位小朋友最初糖果数的一半,则需单独处理。

#include <iostream>
#include <string>
using namespace std;
 
int n; 
int a[105];
int b[105]={0};
int ans=0;
void change(int n)
{
	for(int i=1;i<n;i++)
	{
		b[i]=a[i+1]/2+b[i];
		b[i]=b[i]-a[i]/2;
	}
	b[n]=a[1]/2+b[n];        //最后一项 
	b[n]=b[n]-a[n]/2;
	for(int i=1;i<=n;i++)
	{
		if(b[i]%2==1)       //奇数 
		{
			ans++;       //记录这一轮操作后,奇数的个数
			b[i]++;
		}
		a[i]=b[i];        //将b赋值给a 
	}
}
int main()
{
    cin >> n;
    for(int i=1;i<=n;i++)
    {
    	cin >> a[i];
    	b[i]=a[i];
    }
    while(1)
    {
    	int flag=0;       //每次循环开始,标志位重新清零
    	change(n);        //调用函数 
    	int x=a[1];   
    	for(int i=2;i<=n;i++)
    	{
    		if(a[i]!=x)	           //若有一值不相等则,跳出判断,且标志位置1 
    		{
    			flag=1;
    			break;
    		}
    	}
        /*for(int i=1;i<=n;i++)
    	{
    		cout << a[i] << " ";
    	}
    	cout << endl; */
    	if(flag==0)         //若标志位不变,则全部值相等,则跳出while循环 
    	{
    		break;
    	}
    	
    }
    cout << ans;
    return 0;
}
举报

相关推荐

0 条评论