P5661 [CSP-J 2019] 公交换乘 模拟

48 篇文章 0 订阅
4 篇文章 1 订阅
文章描述了一个针对B市的公共交通优惠方案,乘客在乘坐地铁后可获得优惠票用于免费乘坐公交车。程序需根据输入的乘车记录计算总花费。输入包含乘车记录数量、每次乘车的交通类型、票价和时间。输出为总花费。提供的代码示例使用双队列模拟优惠券管理,确保有效优惠券的正确使用。
摘要由CSDN通过智能技术生成

题目描述

著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:

  1. 在搭乘一次地铁后可以获得一张优惠票,有效期为 45 分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指开始乘公交车的时间与开始乘地铁的时间之差小于等于 45 分钟,即: tbus​−tsubway​≤45
  2. 搭乘地铁获得的优惠票可以累积,即可以连续搭乘若干次地铁后再连续使用优惠票搭乘公交车。
  3. 搭乘公交车时,如果可以使用优惠票一定会使用优惠票;如果有多张优惠票满足条件,则优先消耗获得最早的优惠票。

现在你得到了小轩最近的公共交通出行记录,你能帮他算算他的花费吗?

输入格式

输入文件的第一行包含一个正整数 n,代表乘车记录的数量。

接下来的 n 行,每行包含 3 个整数,相邻两数之间以一个空格分隔。第 i 行的第 1 个整数代表第 i 条记录乘坐的交通工具,0 代表地铁,1 代表公交车;第 2 个整数代表第 i 条记录乘车的票价pricei​ ;第三个整数代表第 i 条记录开始乘车的时间 ti​(距 0 时刻的分钟数)。

我们保证出行记录是按照开始乘车的时间顺序给出的,且不会有两次乘车记录出现在同一分钟。

输出格式

输出文件有一行,包含一个正整数,代表小轩出行的总花费。

 

输入 #1
6
0 10 3
1 5 46
0 12 50
1 3 96
0 5 110
1 6 135
输出 #1
36

 这题看上去可能没有什么思想,俗话说抽象不出来。

但是这题根本就不用抽象!!!!!!

直接用代码模拟他就好了

这不就是天津地铁干的活吗为啥让我来

用一个队列模拟优惠券箱,但是我这里大炮打蚊子了,用了两个队列

相当于遍历整个队列,由于队列无法进行关于下标的操作,所以每次都把不用的优惠卷弹出去,到备用队列。发现此优惠卷可以用时,再将备用队列的弹回来就好了。

# include <iostream>
# include <cstdio>
# include <algorithm>
# include <deque>
using namespace std;
# define int long long
int n,sum;
struct node{
    int num;
    int p;
    int t;
};
int num1,p1,t1;
deque <node> q;
deque <node> q1;
signed main(){
    scanf("%lld",&n);
    for (int i=1;i<=n;i++){
        scanf("%lld%lld%lld",&num1,&p1,&t1);
        if (num1==0){
            node x;
            x.num=num1;
            x.p=p1;
            x.t=t1;
            q.push_back(x);
            sum+=p1;
        }else{
            while(!q.empty()&&t1-q.front().t>45){
                q.pop_front();
            }
            bool flag=false;
            while(!q.empty()){
                node x=q.front();
                
                q.pop_front();
                if (p1<=x.p){
                    flag=true;
                    break;
                }else{
                    q1.push_back(x);
                }
            }
            if (flag==false){
                sum+=p1;
            }
            while(!q1.empty()){
                node x=q1.back();
                q1.pop_back();
                q.push_front(x);
            }
        }
    }
    printf("%lld",sum);
    return 0;
}

对不起,由于我是一个文本交互的模型,我无法提供图像内容或直接链接到具体的题解或解决方案。但是,我可以帮你理解CSP-J2019公交换乘问题的基本概念和解决策略,这通常涉及到数据结构图论以及算法设计。 CSP-J2019中的公交换乘问题可能是一个典型的旅行商问题(Traveling Salesman Problem, TSP)变种,或者是寻找最优路径的问题,其中涉及到公交网络中不同站点之间的最短路径或最少换乘次数。解决此类问题通常需要使用动态规划、贪心算法或者一些启发式搜索算法,比如A*搜索或Dijkstra算法。 如果你需要了解题目的基本思路,可能会这样操作: 1. 建立一个图,节点代表公交站点,边代表两个站点之间的路线及其长度或换乘次数。 2. 对于每个节点,计算从起点到所有其他节点的最短路径,形成一个邻接矩阵或邻接表。 3. 使用动态规划方法,例如记忆化搜索,尝试所有可能的路径,每次选择当前未访问节点中距离最近的一个,直到遍历完所有节点并回到起点,记录下总的距离或换乘次数。 4. 为了优化,可以考虑使用启发式搜索策略,如用估算的总距离作为启发信息,优先探索看起来更优的路径。 如果你对具体解法有疑问,或者想了解某个步骤的详细操作,请告诉我,我会尽力解释。至于详细的题解,建议你查阅相关的代码库、论坛帖子或在线教程,它们通常会有文字描述和步骤示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值