C++有n个同学正在排队打饭,第i个同学排在从前往后第i个位置。但是这天食堂内只有一个食堂阿姨,为了使同学们都能尽快的吃上饭,每一个同学在打完一份饭之后就会排在队伍的末尾先吃着打到的饭,我们知道第i个同学的饭量为ai,也就是说第i个同学要吃ai份饭才能吃饱,当一位同学吃饱后,他就会立刻离开食堂,不会排在队伍的末尾。食堂阿姨想知道,在打完k份饭之后,队伍的样子是怎样的,但是食堂阿姨数学不太好,想让你帮忙想想办法。
时间: 2024-02-22 18:57:38 浏览: 29
这是一个模拟题目,可以使用队列来模拟同学们排队打饭的过程。我们可以用一个循环来模拟食堂阿姨不断发饭的过程,每次循环都取出队头的同学,并将他的饭量减去1,如果他的饭量变成了0,就将他从队列中弹出。同时,如果当前已经发了k份饭,就直接输出队列中剩余的同学的编号,这些同学已经吃饱了。
下面是一份C++的代码实现:
```c++
#include <iostream>
#include <queue>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
queue<int> q;
for (int i = 1; i <= n; i++) {
int a;
cin >> a;
q.push(i); // 将第i个同学加入队列
}
int cnt = 0;
while (!q.empty()) {
int t = q.front();
q.pop(); // 取出队头的同学
cnt++;
if (cnt == k) {
while (!q.empty()) {
cout << q.front() << " ";
q.pop();
}
break;
}
int a = --(a[t - 1]); // 减少第t个同学的饭量
if (a > 0) {
q.push(t); // 如果第t个同学还没吃饱,就将他加入队尾
}
}
return 0;
}
```
这个程序会读入n和k,表示有n个同学在排队打饭,并且需要打k份饭。然后程序会读入每个同学的饭量a[i],并将他们加入队列q中。接下来,程序会不断地从队列中取出同学,并将他们的饭量减1,如果一个同学的饭量变成了0,就将他从队列中弹出。如果已经发了k份饭,就直接输出队列中剩余的同学的编号,这些同学已经吃饱了。