刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

分糖果

题目描述:

有N个小朋友从左到右排成一排,每个小朋友手中都有一定数量的糖果,且糖果总数量是N的倍数。计算出最少调整几次可以使每个小朋友的糖果数量相同。调整规则如下:

规则1:每个小朋友的糖果只能调整到左右相邻的两个小朋友手中;

规则2:第一个小朋友的糖果只能调整到第二个小朋友手中;

规则3:最后一个小朋友的糖果,只能调整到倒数第二个小朋友手中。

例如:N等于3时,1~3号小朋友原有糖果数量分别为6,4,2。

1)1号小朋友拿出两块给2号小朋友;

2)2号小朋友拿出两块给3号小朋友;

两次操作后三个小朋友手中糖果分别为4,4,4。即按照调整规则最少操作2次可以使3个小朋友手中糖果数量都相同。

现按照顺序给出1~N号小朋友手中原有糖果数量,按照调整规则计算出最少调整几次可以使小朋友手中的糖果数量都相同。

输入描述:

第一行输入一个正整数N(N<50),表示有N个小朋友

第二行输入N个正整数(1<正整数<100),表示1到N号小朋友手中原有糖果数量,正整数之间以一个空格隔开,且所有正整数之和是N的倍数

输出描述:

输出一个正整数,表示按照调整规则最少调整几次可以使小朋友手中的糖果数量都相同。


样例输入:

3
642

样例输出:

2

使用微信搜索喵呜刷题,轻松应对考试!

答案:

```#include #include #include using namespace std;int minOperations(int N, vector& candies) int total = 0;for (int i = 0; i < N; i++) {total += candies[i];}int target = total / N;int operations = 0;for (int i = 0; i < N - 1; i++) {int diff = abs(candies[i] - candies[i + 1]);operations += (diff - 1) / 2;candies[i + 1] += min(diff, candies[i]);candies[i] -= min(diff, candies[i]);}int lastDiff = abs(candies[N - 1] - target);operations += lastDiff / 2;candies[N - 2] += min(lastDiff, candies[N - 1]);candies[N - 1] -= min(lastDiff, candies[N - 1]);return operations;int main() int N;cin >> N;vector candies(N);for (int i = 0; i < N; i++) {cin >> candies[i];}cout << minOperations(N, candies) << endl;return 0;```

解析:

【喵呜刷题小喵解析】:
这个问题要求找到一个调整糖果数量的最小次数,使得每个小朋友的糖果数量相同。根据题目给出的规则,每个小朋友的糖果只能调整到左右相邻的两个小朋友手中,第一个小朋友的糖果只能调整到第二个小朋友手中,最后一个小朋友的糖果只能调整到倒数第二个小朋友手中。

首先,我们需要计算每个小朋友的糖果数量的平均值,即目标糖果数量。然后,我们遍历每个小朋友,计算当前小朋友和相邻小朋友的糖果数量差,并根据规则调整糖果数量。对于第一个小朋友,由于规则限制,我们直接将糖果调整到第二个小朋友手中,对于最后一个小朋友,我们也直接将糖果调整到倒数第二个小朋友手中。对于其他小朋友,我们将糖果数量差的一半(向下取整)分配给左右两个相邻的小朋友。

最后,我们返回糖果调整的次数。在遍历过程中,我们累加了糖果调整的次数。由于每个小朋友的糖果数量差最多为99,因此每个小朋友最多调整49次,总共最多调整49*(N-1)次。但实际上,由于糖果数量差会逐渐减小,所以调整次数远小于这个值。

以上是一个C++的解决方案,实现了输入、处理和输出的功能。在主函数中,我们首先读取小朋友的数量和每个小朋友的糖果数量,然后调用minOperations函数计算最少调整次数,并输出结果。
创作类型:
原创

本文链接:分糖果 题目描述: 有N个小朋友从左到右排成一排,每个小朋友手中都有一定数量的糖果,且糖果总数量是N

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share