描述 有一个游戏,游戏规则如下: n 个队员 (不包括小明) 围成一个圈,每个人手里拿着一些花束 (数量也可能为 0),小明 站在圆圈的中间,队员需要传递花束给小明,每个鼓点只允许一个人传送一束花,最终要求圆圈上所有 人的花束都传递给小明。小明最后可以收到多少花 输入 单组数据。 第一行 n,代表队员数量。 第 2 行有n个数,每个整数 a[i],代表每个队员最开始拿的花束数量。 0 ≤ a[i] ≤ 10^3 所有组的 n 之和不超过 10^6 输出 一个整数,代表收到花的数量。c语言
时间: 2023-05-21 10:04:22 浏览: 83
用一个故事讲完CPU的工作原理
很高兴为您解答这道算法题。根据题目描述,这是一个经典的约瑟夫问题,可以使用循环队列的方法解决。
以下是完整的 C 语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1000005
int a[MAXN], q[MAXN];
int main()
{
int n, head = 0, tail = -1, ans = 0;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
tail++;
q[tail] = i;
}
while (head <= tail) {
int p = q[head];
head++;
ans += a[p];
if (head <= tail) {
p = q[head];
head++;
int k = a[p];
a[p] = 0;
tail++;
q[tail] = p;
}
for (int i = 1; i <= k && head <= tail; ++i) {
p = q[head];
head++;
a[p]++;
if (a[p] == 1) {
tail++;
q[tail] = p;
}
}
}
printf("%d\n", ans);
return 0;
}
```
您还有其他问题需要解答吗?我将竭诚为您服务。
阅读全文