1 条题解

  • 0
    @ 2025-3-22 10:50:53

    经典的题目

    #include <bits/stdc++.h>
    using namespace std;
    struct node {
            long long t;//乘坐的时间
            int pri;//价格/优惠券的面值
            int used;//是否被使用
    };
    queue<node> p;//存放地铁的相关信息,先进先出适合处理时间顺序问题
    int opt, price;
    long long ti;//乘坐交通工具的时间
    int n;
    long long sum = 0;//总费用
    int main() {
            
            cin >> n;
            node x;
            for (int i = 1; i <= n; i++) {
                    cin >> opt >> price >> ti;
                    if (opt == 0) {//乘坐地铁,直接将优惠券的面值和时间存入
                            sum += price;
                            x = {ti, price, 0};
                            p.push(x);
                    } else {
                            //循环判断是否存在超过当前乘坐时间45分钟的优惠券,有则删除
                            while (ti - p.front().t > 45) {
                                    p.pop();
                            }
                            //遍历剩下的队列,看队列中是否存在优惠券面值大于或等于当前票价的
                            bool flag = false;
                            int len = p.size();
                            while (len--) {// !p.empty()  p.size()
                                    if (price <= p.front().pri && p.front().used == 0 && flag == false && ti - p.front().t <= 45) {
                                            //如果有,则标记为已找到,并且被使用
                                            p.front().used = 1;
                                            flag = true;
                                    }
                                    //将不符合小于当前票价的优惠券的重新入队
                                    p.push(p.front());
                                    p.pop();
                            }
                            //没有找到,则将费用计算到总费用中
                            if (flag == false)sum += price;
                    }
            }
            cout << sum;
            return 0;
    }
    

    信息

    ID
    946
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    4
    上传者