首页 > 其他分享 >CSP历年复赛题-P5661 [CSP-J2019] 公交换乘

CSP历年复赛题-P5661 [CSP-J2019] 公交换乘

时间:2024-06-11 17:22:27浏览次数:25  
标签:P5661 队列 45 int 优惠券 front J2019 CSP

原题链接:https://www.luogu.com.cn/problem/P5661

题意解读:坐一次地铁得到一张优惠券,坐公交可以已使用金额大于等于票价的优惠券,优惠券45分钟之内有效,计算所有乘车记录的总花费。

解题思路:

采用队列记录所有坐地铁得到的优惠券;

每次都将过期优惠券从队列中踢出,保证队列里的优惠券都是没有过期的,而且队列的元素不会超过45个;

对于乘坐公交,在队列中从队头开始查找一张金额大于等于公交票价且没有使用的优惠券,标记为已使用(没有必要从队列删除,因为队列总元素不会超过45个);

如果没有找到合适优惠券,则需要买票。

注意:由于要枚举队列元素,用手写队列比STL queue更便于处理

100分代码:

#include <bits/stdc++.h>
using namespace std;

int n, o, p, t, ans;

struct ticket
{
    int price; //优惠券价格
    int time; //优惠券时间
    bool used; //优惠券是否已被使用
} q[100005];
int front = 1, back = 0;

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> o >> p >> t;
        //超过45分钟的优惠券出队列
        while(front <= back && t - q[front].time > 45) front++;
        if(o == 0)
        {
            ans += p; //地铁花费
            q[++back] = {p, t, false}; //增加优惠券
        }
        else if(o == 1)
        {
            bool find = false; //是否找到合适优惠券
            for(int j = front; j <= back; j++)
            {
                if(q[j].used == false && q[j].price >= p) //找到合适优惠券
                {
                    q[j].used = true;
                    find = true;
                    break;
                }
            }
            if(!find) ans += p; //没有找到合适优惠券则需要花钱
        }
    }
    cout << ans;
    return 0;
}

 

标签:P5661,队列,45,int,优惠券,front,J2019,CSP
From: https://www.cnblogs.com/jcwy/p/18242418

相关文章

  • CSP历年复赛题-P5018 [NOIP2018 普及组] 对称二叉树
    原题链接:https://www.luogu.com.cn/problem/P5018题意解读:找到是对称二叉树的最大子树节点数。解题思路:1、先统计每一个节点为子树的节点数intdfs1(introot){if(root==-1)return0;returncnt[root]=dfs1(tree[root].l)+dfs1(tree[root].r)+1;}2、再......
  • CSP历年复赛题-P5017 [NOIP2018 普及组] 摆渡车
    原题链接:https://www.luogu.com.cn/problem/P5017题意解读:先将问题进行抽象、建模。设一条数轴,从左到右,每个点对应一个时刻,每个时刻可能有多个人到达,然后有若干个发车时刻,每两个发车时刻间隔必须>=m,每个人的等待时长就是到最近一个发车时刻的时间累加,计算所有人等待时间最小值。......
  • 【题解】 [CSP-J 2019] 纪念品
    题目描述题目大意在\(T\)天内,有\(n\)种纪念品和初始的\(m\)元。可以得到每天每种纪念品的价格。每一天可以以当日价格买卖纪念品。特别的,当天卖出得到的钱可以当天买入,当日买入的纪念品也可以当日卖出。当然可以一直持有。但是,\(T\)天过后,手上不可以持有纪念品。思路......
  • CSP历年复赛题-P3957 [NOIP2017 普及组] 跳房子
    原题链接:https://www.luogu.com.cn/problem/P3957题意解读:有n个格子,每个格子有不同的距离和分数,从起点,每次可跳距离为d,用g金币后可跳距离范围可以变成max(d-g,1)~d+g,求最小的g,使得可跳跃得分不少于k。解题思路:1、单调性分析:如果g越大,可跳跃的范围就越大,理论上能得的分数越......
  • 【题解】[CSP-J 2019] 公交换乘
    题目描述题目大意给出\(n\)次出行记录(地铁或公交车),有以下优惠方案:搭乘一次地铁后可以获得一张有效期为45分钟的优惠票,可以免费搭乘一次票价不超过该地铁票价的公交车。优惠票可以累计存储优先使用过期时间早的优惠票。思路枚举每一次出行:如果是地铁。累加花费,并记......
  • CSP历年复赛题-P3956 [NOIP2017 普及组] 棋盘
    原题链接:https://www.luogu.com.cn/problem/P3956题意解读:计算从(1,1)走到(m,m)的最小花费,有几个限定:同色格子可以走,花费为0;不同色格子可以走,花费为1;有色格子可以走到无色格子,花费为2,且用将无色格子临时染色;无色格子不能走到无色格子。解题思路:可以采用DFS来暴搜所有路径,需......
  • CSP历年复赛题-P3955 [NOIP2017 普及组] 图书管理员
    原题链接:https://www.luogu.com.cn/problem/P3955题意解读:给出n个图书编号,q个需求码,找到后缀与需求码匹配的最小图书编号,没有输出-1。解题思路:先对图书编号排序,用枚举法遍历每一个图书编号,看后缀是否与需求码相同。100分代码:#include<bits/stdc++.h>usingnamespacestd;c......
  • CSP历年复赛题-P2119 [NOIP2016 普及组] 魔法阵
    原题链接:https://www.luogu.com.cn/problem/P2119题意解读:在一组数里找出所有的Xa,Xb,Xc,Xd的组合,使得满足Xa<Xb<Xc<Xd,Xb-Xa=2(Xd-Xc),Xb-Xa<(Xc-Xb)/3,并统计出每个数作为A,B,C,D出现的次数。解题思路:1、枚举(O(n^4))首先想到的是通过4重循环枚举所有可能的Xa,Xb,Xc,Xd,然后判......
  • CSP历年复赛题-P2058 [NOIP2016 普及组] 海港
    原题链接:https://www.luogu.com.cn/problem/P2058题意解读:计算24小时时间窗口内不同国家的数量,是队列的典型应用。解题思路:本题需要用到两个关键的数据结构:队列、数组队列用来保存24小时内到达的船的时间,数组用来保存24小时内每个国家有多少人每到一只船,需要把时间放入队列,如......
  • CSP历年复赛题-P2010 [NOIP2016 普及组] 回文日期
    原题链接:https://www.luogu.com.cn/problem/P2010题意解读:计算两个日期之间有多少个日期是回文。解题思路:如果通过枚举两个日期之间的所有日期,然后判断回文,则会有几个问题:枚举数据规模在10^7级别,再加上对于日期加一天、判断回文等处理,有可能超时,而且对日期进行加一天、判断回......