队列加结构体的解法
2026-05-17 10:19:34
发布于:湖北
4阅读
0回复
0点赞
这是一个模拟问题,需要计算使用地铁-公交换乘优惠后的总花费。
对于每条记录:
如果是地铁(type=0):
支付全额票价
将(时间 费用)加入队列
如果是公交(type=1):
遍历队列中的优惠票(按FIFO顺序)
跳过已失效的票(时间>45分钟 或 地铁票价<公交票价)
找到第一张可用的票就使用(免费),从队列移除
如果没有可用票,支付公交票价
#include <iostream>
#include <queue>
using namespace std;
struct Tk {
int time; // 地铁乘车时间
int fee; // 地铁票价
};
int main() {
int n;
cin >> n;
queue<Tk> ts; // 存储可用的优惠票
int tt = 0;
for (int i = 0; i < n; i++) {
int type, price, time;
cin >> type >> price >> time;
if (type == 0) {
// 地铁:支付票价,获得优惠票
tt += price;
ts.push({time, price});
} else {
// 公交:尝试使用优惠票
bool used = false;
// 遍历队列找可用的优惠票
// 需要移除已检查的票,所以用临时队列
queue<Tk> temp;
while (!ts.empty()) {
Tk t = ts.front();
ts.pop();
// 检查是否可用
if (time - t.time <= 45 && t.fee >= price && !used) {
// 找到可用票,使用它
used = true;
// 不使用这张票了(已消费)
} else {
// 票失效或已找到可用票,保留到临时队列
temp.push(t);
}
}
// 恢复未使用的票
while (!temp.empty()) {
ts.push(temp.front());
temp.pop();
}
if (!used) {
// 没有可用优惠票,支付公交票价
tt += price;
}
}
}
cout << tt << endl;
return 0;
}
这里空空如也



有帮助,赞一个