公交换乘C++

news2024/9/28 5:21:31

题目:


 

 

 


样例解释:

样例#1:
第一条记录,在第 3 分钟花费 10 元乘坐地铁。
第二条记录,在第 46 分钟乘坐公交车,可以使用第一条记录中乘坐地铁获得的优惠票,因此没有花费。
第三条记录,在第 50 分种花费 12 元乘坐地铁。
第四条记录,在第 96 分钟乘坐公交车,由于距离第三条记录中乘坐地铁已超过 45 分钟,所以优惠票已失效,花费 3 元乘坐公交车。
第五条记录,在第 110 分钟花费 5 元乘坐地铁。
第六条记录,在第 135 分钟乘坐公交车,由于此时手中只有第五条记录中乘坐地铁获得的优惠票有效,而本次公交车的票价为 6 元,高于第五条记录中地铁的票价 5 元,所以不能使用优惠票,花费 6 元乘坐公交车。
总共花费 36 元。
样例#2:
第一条记录,在第 1 分钟花费 5 元乘坐地铁。
第二条记录,在第 16 分钟花费 20 元乘坐地铁。
第三条记录,在第 23 分钟花费 7 元乘坐地铁。
第四条记录,在第 31 分钟乘坐公交车,此时只有第二条记录中乘坐的地铁票价高于本次公交车票价,所以使用第二条记录中乘坐地铁获得的优惠票。
第五条记录,在第 38 分钟乘坐公交车,此时第一条和第三条记录中乘坐地铁获得的优惠票都可以使用,使用获得最早的优惠票,即第一条记录中乘坐地铁获得的优惠票。
第六条记录,在第 68 分钟乘坐公交车,使用第三条记录中乘坐地铁获得的优惠票。
总共花费 32 元。
样例#3:
第一条记录,在第 1 分钟花费 5 元乘坐地铁。
第二条记录,在第 16 分钟花费 6 元乘坐地铁。
第三条记录,在第 23 分钟花费 10 元乘坐地铁。
第四条记录,在第 47 分钟乘坐公交车。此时由于距离第一条记录中乘坐地铁已超过 45 分钟,所以优惠票已失效;第二,三条记录中的优惠票有效,但本次公交票价为 7 元,高于第二条的优惠票,只有第三条记录中的优惠票可以使用,所以使用第三条记录的优惠票。
第五条记录,在第 50 分钟乘坐公交车,此时第二,三条记录的优惠票有效,但第三条记录的优惠票已经使用,第二条记录的优惠票高于本次公交票价,所以使用第二条记录的优惠票。
第六条记录,在第 55 分钟乘坐公交车,第一条记录的优惠票已失效,第二,三条记录的优惠票已使用,花费 10 元乘坐公交车。
总共花费 31 元。


 思路:

用一个数组来装所有的收集到的赠票。每当坐地铁的时候,就直接花钱,然后获得一张赠票,放到数组里面。每当坐公交的时候,看看数组里面有没有时间合适,价格小于现在公交票价的赠票,并且没用过的赠票,直接用时间最早的那一张就可以了。

每张赠票要存三个信息,因此用一个结构体来存。数据不超过105105,因此开一个105105长度的数组。

const int MAXN = 100005;
struct Ticket {
    //赠票的价格,最晚使用时间和是否需用过
    int price, time, used;
} q[MAXN];//赠票盒子

然而,出题人会这么善良么?NO,NO,NO,显然不会。我们想想极限情况什么样子,极限数据105105,假设开始的时候全坐地铁,坐了5∗1045∗104 次以后,我们的盒子里面有好多票啊。后面全坐公交,要坐5∗1045∗104 次,每次都在这个大盒子里面找合适的票,复杂度O(n2)O(n2),总计算量2.5∗1092.5∗109,我们在超时的边缘疯狂试探啊。

怎么优化呢?关键点在于题中说每次坐车开始时间都不重合,而且45分钟票就过期。所以理论上来讲,盒子里最多也就有45张没过期的票。大量的票都是已经过期了的,没必要从头扫一遍数组,在大量过期的票中浪费宝贵的青春。所以我们想到类似手写队列的方法,定义一个head变量和一个tail变量,分别表示目前还没过期的第一张票的位置,和下一张新的赠票在数组里要插入的位置,每次从head到小于tail循环即可。每次最多循环45次,总共105105次循环,肯定不会超时。

 其余细节看代码注释吧。不要复制粘贴哦,理解题目才是王道!!!


 

#include <iostream>
using namespace std;
const int MAXN = 100005;
struct Ticket {
    //赠票的价格,最晚使用时间和是否需用过
    int price, time, used;
} q[MAXN];//赠票盒子
int head, tail, n, cost;

int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) {
        int op, price, time;
        //输入每次坐车的种类,价格和发车时间
        cin >> op >> price >> time;
        if (op == 0) {
            //如果是坐地铁,直接把价格加到cost里面
            cost += price;
            //新一张赠票插入数组末尾,这张票的最晚使用时间是当前时间+45
            q[tail].time = time + 45;
            //赠票面额就是地铁票价
            q[tail++].price = price;
        } else {
            //先用一个循环把过期票扔掉
            while (head < tail && q[head].time < time) {
                head++;
            }
            bool found = false;//表示是否有合适的赠票,先假设没有
            for (int j = head; j < tail; ++j) {
                //循环所有剩余的票,这些一定都没过期,因为题目中时间是按顺序给我们的
                if (q[j].price >= price && q[j].used == 0) {
                    //如果价格合适,并且没用过,标记找到了,这张票标记用过
                    found = true;
                    q[j].used = 1;
                    break;
                }
            }
            //如果没找到合适的赠票,老老实实花钱买吧
            if (!found) cost += price;
        }
    }
    cout << cost << endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2172444.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于微信小程序的智慧社区的设计与实现

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

docker拉取镜像失败

docker拉取镜像失败 错误提示检查linux服务器是否开通防火墙开放端口重启防火墙查看已开放的端口 修改配置文件 错误提示 检查linux服务器是否开通防火墙 firewall-cmd --staterunning表示防火墙正在运行&#xff0c;显示not running表示未运行&#xff0c;使用以下命令开启防…

vite 底层解析

vite 目前大多数框架的前端构建工具都已经被vite取代&#xff0c;相信你已经使用过vite了。可是在使用过程中&#xff0c;vite对我来说一直是模糊的&#xff0c;现在就来一探究竟&#xff0c;为啥它更好&#xff1f; 接下来我将为从以下几点出发&#xff0c;究其原理 一、原生…

基于大数据技术的智慧居家养老服务平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

Redis实战篇-短信登入

Redis实战篇-短信登入 该笔记是来源于黑马程序员的Redis项目课程,为了后续方便复习。将笔记记录在博客之中 实战篇我们要学习一些什么样的内容 1.本期任务 短信登录 使用redis共享session来实现 商户查询缓存 理解缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩等问题 …

基于冲突动态监测算法的健身房预约管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着健身热潮的兴起&#xff0c;健身房管理面临着日益增长的会员需求与资源分配的挑战。传统的人工预约方式不仅效率低下&#xff0c;且容易出现时间冲突和资源浪费的情况。为了解决这一问题&#xff0c;基于冲突动态监测算法的…

【CSS/HTML】CSS实现两列布局,一列固定宽度,一列宽度自适应方法

文章目录 1.固定宽度区浮动&#xff0c;自适应区不设宽度而设置 margin2.float与margin配合使用3.固定宽度区使用绝对定位&#xff0c;自适应区设置margin4.使用display:table实现 不管是左是右&#xff0c;反正就是一边宽度固定&#xff0c;一边宽度自适应。 博客的很多主题也…

Python学习(3):画散点图和箱线图

1. 散点图&#xff08;matplotlib库&#xff09; 1.1 代码示例 import matplotlib.pyplot as plt# 准备数据 x [1, 2, 3, 4, 5] y [2, 4, 6, 8, 10]# 绘制散点图 plt.scatter(x, y)# 添加标题和标签 plt.title("散点图示例") plt.xlabel("X 轴") plt.y…

Android PopupWindow.showAsDropDown报错:BadTokenException: Unable to add window

Android PopupWindow.showAsDropDown报错&#xff1a;BadTokenException: Unable to add window Android PopupWindow.showAsDropDown报错&#xff1a; android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity ru…

【华为HCIP实战课程一】OSPF相关基础介绍及基础配置,网络工程师必修

一、OSPF介绍 开放式最短路径优先协议OSPF(Open Shortest Path First),IPv4使用的OSPFv2,针对IPv6使用OSPFv3协议。 二、为什么需要OSPF OSPF出现之前,网络广泛使用RIP路由协议,RIP由于最大16跳数限制无法适应大型网络,RIP是基于距离矢量算法的路由协议,应用在大型网…

MySQL使用FROM_UNIXTIME转换时间戳timestamp无效问题原因

问题点在于timestamp的长度&#xff0c;检查下存储在数据库里的时间戳的数据格式及长度。 MySQL的FROM_UNIXTIME函数默认处理的是10位的时间戳&#xff0c;不是10位就会出现无效的情况&#xff0c;但是数据库并不会进行异常提示。 一般情况下&#xff0c;普遍遇到的是10位或者…

VSCode调试Electron

使用vscode来调试electron主进程&#xff0c;实现断点调试、监视变量&#xff0c;跟踪代码执行&#xff0c;极大地提高开发效率。 在vscode代码编辑器中左侧找到运行或调试 上方下拉框添加配置 点击添加配置后&#xff0c;会在根目录的.vscode目录下存在launch.json文件&am…

阿里云部署1Panel(失败版)

官网脚本部署不成功 这个不怪1panel,这个是阿里Linux 拉不到docker的下载源,懒得思考 正常部署直接打开官网 https://1panel.cn/docs/installation/online_installation/ 但是我使用的阿里云os(Alibaba Cloud Linux 3.2104 LTS 64位) 我执行不管用啊装不上docker 很烦 curl -s…

Android中使用RecyclerView制作横向轮播列表及索引点

在Android开发中&#xff0c;RecyclerView是一个非常强大的组件&#xff0c;用于展示列表数据。它不仅支持垂直滚动&#xff0c;还能通过配置不同的LayoutManager实现横向滚动&#xff0c;非常适合用于制作轮播图或横向列表。本文将详细介绍如何使用RecyclerView在Android应用中…

【中间件——基于消息中间件的分布式系统的架构】

1. 基于消息中间件的分布式系统的架构 从上图中可以看出来&#xff0c;消息中间件的是 1&#xff1a;利用可靠的消息传递机制进行系统和系统直接的通讯 2&#xff1a;通过提供消息传递和消息的排队机制&#xff0c;它可以在分布式系统环境下扩展进程间的通讯。 1.1 消息中间件…

PaddleOCR 表格识别,docker部署,cpu版本

前置环境 centeros7 docker 拉取镜像 docker pull registry.baidubce.com/paddlepaddle/paddle:2.6.1 参考&#xff1a;开始使用_飞桨-源于产业实践的开源深度学习平台 这里拉取的镜像并不能立马用&#xff0c;只是内置好运行环境 随便找个目录下载paddleocr的代码 git…

Ubuntu/Debian网络配置(补充篇)

Ubuntu/Debian网络配置补充 在《Ubuntu/Debian网络配置 & Ubuntu禁用自动更新_ubuntu nmtui-CSDN博客》上总结的“配置网络”章节&#xff0c;对于新版本或者“最小化安装”场景&#xff0c;可能不适应&#xff0c;故此本文做一下补充&#xff0c;就不在原有文章上做更新了…

【友元补充】【动态链接补充】

友元 友元的目的是让一个函数或者类&#xff0c;访问另一个类中的私有成员。 有缘的关键字friend是一个修饰符。 友元分为友元类和友元函数 1.全局函数作友元 2.类作友元 3.类的一个成员函数作友元 好处&#xff1a;可以通过友元在类外访问类内的私有和受保护类型的成员 坏处…

在树莓派上基于 LNMP 搭建 Nextcloud

原文链接&#xff1a;https://blog.iyatt.com/?p17296 环境 树莓派CM4raspios 20240704 Debian 12 arm64 搭建 LNMP 环境 安装 Nginx sudo apt update sudo apt install -y nginx安装 php 及功能组件支持 参考&#xff1a;https://docs.nextcloud.com/server/latest/adm…

【高分系列卫星简介——高分辨率多模综合成像卫星】

高分辨率多模综合成像卫星 高分辨率多模综合成像卫星&#xff08;以下简称“高分多模卫星”&#xff09;是中国航天科技集团所属中国空间技术研究院抓总负责研制的具备亚米级分辨率的民用光学遥感卫星。以下是对高分多模卫星的详细介绍&#xff1a; 一、基本信息 发射时间&…