用c++写:有n个学生想要喝茶。其中,第i个学生在第xi秒来排队,如果同一秒有好多人来,那么编号小的学生在前。 每一个学生都要花1秒钟的时间喝茶,如果第i个学生在第yi秒还没有喝到茶,那么他就会离开。现在,请你输出每个学生喝到茶的时间,如果喝不到,输出0.
时间: 2024-03-12 20:45:18 浏览: 10
好的,下面是用 C++ 实现的代码:
```cpp
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
struct Student {
int x;
int y;
int id;
bool operator<(const Student& s) const {
if (x == s.x) {
return id < s.id;
}
return x < s.x;
}
};
int main() {
int n;
cin >> n;
vector<Student> students(n);
for (int i = 0; i < n; i++) {
cin >> students[i].x >> students[i].y;
students[i].id = i + 1;
}
sort(students.begin(), students.end());
vector<int> ans(n, 0);
queue<Student> q;
int cur_time = 0;
for (int i = 0; i < n; i++) {
while (!q.empty() && q.front().y + 1 <= cur_time) {
q.pop();
}
while (!students.empty() && students[0].x <= cur_time) {
q.push(students[0]);
students.erase(students.begin());
}
if (q.empty()) {
cur_time = students[0].x;
q.push(students[0]);
students.erase(students.begin());
}
if (!q.empty() && q.front().y >= cur_time) {
Student cur_student = q.front();
q.pop();
ans[cur_student.id - 1] = cur_time + 1;
cur_time++;
} else {
ans[q.front().id - 1] = 0;
}
}
for (int i = 0; i < n; i++) {
cout << ans[i] << endl;
}
return 0;
}
```
代码中,我们首先读入学生数量 n 和每个学生的排队时间 x 和最后离开时间 y。将学生放入一个结构体 Student 中,并按照排队时间 x 进行排序。然后,我们定义一个数组 ans,用来存储每个学生喝茶的时间。接着,我们用一个队列来模拟学生排队的过程。我们从第一个学生开始,依次将学生加入队列。如果当前的学生排队时间 x 晚于队列末尾的学生,则将该学生加入队列;否则,将该学生从结构体中删除,并输出 0。当队列不为空时,每次取出队头的学生,更新其喝茶时间,并将喝到茶的学生输出。直到队列为空或者所有学生都已经离开,结束程序。