传送门
问题 1431: [蓝桥杯][历届试题]分糖果
时间限制: 1Sec 内存限制: 128MB 提交: 290 解决: 162
题目描述 问题描述 有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。 输入 程序首先读入一个整数N(2< N< 100),表示小朋友的人数。 接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2) 输出 要求程序输出一个整数,表示老师需要补发的糖果数。 样例输入 3 2 2 4 样例输出 4
其实 还算比较好实现的 既然是 一个环 那么就用 永循环一直跑 ,跑到出口break就可以了 但需要注意的是 应该在一轮数据都处理过 之后 单独处理 是否需要给糖果(+1操作), 和下次需要向左给的个数
#include <iostream> #include <cstring> #include <bits/stdc++.h> using namespace std; #define N 10001 int main() { int n; scanf("%d",&n); int a[1003]; //存储当前糖块数 int b[1003]; //存储应该向左传递的糖块数 int sum=0; for (int i=0; i<n; i++) { scanf("%d",&a[i]); b[i] = a[i]/2; } int flag=0; while (1) { for (int i=0; i<n; i++) { if (i==n-1) { a[i] = a[i]-b[i] + b[0]; } else { a[i] = a[i]-b[i] + b[i+1]; } } for (int i=0; i<n; i++) { if (a[i]%2==1) { a[i]++; sum++; } b[i] = a[i]/2; } for (int i=0; i<n; i++) { int flag1=0; for (int j=0; j<n-1; j++) { if (a[j]!=a[j+1]) { flag1 = 1; } } if (flag1==0) { flag=1; break; } } if (flag==1) break; } printf ("%d\n",sum); return 0; }