【题目链接】

ybt 1983:【19CSPJ普及组】公交换乘

【题目考点】

1. 模拟

【解题思路】

  • 设置数组tk保存优惠票,优惠票的属性有:获得时间,价格。
    设下标st,tk[st]是当前时间下,时间最早的有效的票。当i<st时tk[i]是过期的票。当i>=st时,tk[i]是有效的票。

  • 循环输入数据

    • 如果是乘坐地铁,那么添加一张优惠票
    • 如果是乘坐公交
      • 先更新st的值
      • 从st位置开始遍历数组tk,寻找第一个价格高于当前公交票价的优惠票,使用该优惠票。
  • 算法复杂度分析
    因为每次获得优惠票的时间是有序的,因而设置变量st,每次从st开始遍历。相比于每次从头遍历,这样做可以减少对无效票的遍历,降低时间复杂度。
    tk[st]的获得时间到当前时间最多45分钟,题中指出“不会有两次乘车记录出现在同一分钟”,因而有效的优惠票不会超过45个,每次遍历有效优惠票的循环次数不会超过45次。
    整个程序的复杂度为O(45*n) = O(n)

【题解代码】

解法1:

#include <bits/stdc++.h>
using namespace std;
#define N 100005
typedef struct Ticket
{int time;//time:获得票的时间 int price;//price:买地铁票时的价格,即价格小于等于price的公交车可以用这张票 bool isUsed;//标记这张票是否使用过 Ticket(){}Ticket(int a, int b):time(a),price(b),isUsed(false){}
}Ticket;
Ticket tk[N];//保存生成的票
int tk_i, st;//tk_i:记录tk数组中待存储的位置 st: i >= st时,tk[i]是有效的票,i < st时,tk[i]是过期的票
int main()
{int n, cost = 0, type, price, time;// cost:总花费 cin>>n;for(int i = 0; i < n; ++i){cin>>type>>price>>time;if(type == 0)//地铁{tk[tk_i++] = Ticket(time, price);//添加优惠票      cost += price;}else//公交 {while(st < tk_i && time - tk[st].time > 45)//更新过期票和有效票的分界点,使tk[st]是最早的有效的票 st++;bool usedTk = false;//是否使用了优惠票    for(int j = st; j < tk_i; ++j)//搜索优惠票,看能用哪张。循环次数不会超过45次。 {if(tk[j].price >= price && tk[j].isUsed == false)//如果这张票标价比公交票价高,且没用过,那么可以用。 {usedTk = true;tk[j].isUsed = true;break;}}if(usedTk == false)cost += price;}}cout<<cost;return 0;
}

信息学奥赛一本通 1983:【19CSPJ普及组】公交换乘相关推荐

  1. 信息学奥赛一本通 1985:【19CSPJ普及组】加工零件 | 洛谷 P5663 [CSP-J2019] 加工零件

    [题目链接] ybt 1985:[19CSPJ普及组]加工零件 洛谷 P5663 [CSP-J2019] 加工零件 [题目考点] 图论 SPFA算法 [解题思路] 1. 问题分析 每个工人是一个顶点, ...

  2. 信息学奥赛一本通 1982:【19CSPJ普及组】数字游戏

    [题目链接] ybt 1982:[19CSPJ普及组]数字游戏 [题目考点] 1. 字符串处理 用字符数组,或用string类 2. 分离各位数字 [题解代码] 解法1:用字符数组,统计字符串中字符' ...

  3. 信息学奥赛一本通(C++版)NOIP提高组(1820-1829)

    信息学奥赛一本通(C++版)NOIP提高组目录 //1820 [题目描述] 我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所 处位置的(值减1)为指数,以10为底数的幂之和的 ...

  4. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  5. 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)

    信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法   更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...

  6. 信息学奥赛一本通(C++版) 网站补充题目

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 网站补充题目 http://ybt.ssoier ...

  7. 信息学奥赛一本通在线提交地址

    信息学奥赛一本通 1 C++语言入门 1.1 综合 1.1.1 P1458 地球人口承载力估计 正确: 770 提交: 1794 比率: 42.92 % 1.1.2 P1686 Hello, Worl ...

  8. 信息学奥赛一本通(C++版) 第二部分 基础算法 第九章 动态规划

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 第二部分 基础算法 第九章 动态规划 第一节 动 ...

  9. 信息学奥赛一本通 (C++)上机练习

    信息学奥赛一本通(C++)上机练习 此书为娃儿的第一本刷题书.娃儿现在四年级 ,希望他能坚持下来.特开贴加油 luogu: disangan223 第一部分 C++语言 第一章 C++语言入门 T10 ...

最新文章

  1. HIDL示例-C++服务创建Client验证-Android10.0 HwBinder通信原理(三)
  2. hibernate学习(4)
  3. asp上传错误:此键已与该集合的一个元素关联
  4. 关于人脸识别最近浏览器打不开摄像头的解决方案
  5. 如何直观的看出主题模型学习结果的好坏
  6. CV Papers|计算机视觉论文推荐周报20200502期
  7. 2017.9.21 紧急集合 思考记录
  8. java 初始化和清楚_浅谈Java中的初始化和清理
  9. jQuery学习笔记:文档处理
  10. 芯片国产化进程提速 赶超洋品牌核心技术尚欠火候
  11. 苹果录制屏幕在哪设置_屏幕录像专家如何录全屏 屏幕录像专家全屏录制设置方法...
  12. 计算机专业课堂教学,计算机专业网络与课堂教学整合
  13. Android开发-魔窗DeeplinkDemo-AndroidStudio
  14. 优矿-python计算上证50之间的相关系数
  15. VC++6.0 win32 控制台应用程序 简单应用 附代码
  16. 【爬虫】王者荣耀爬取英雄高清4K图片
  17. .NET CORE实践(1)--Ubuntu下的Hello World
  18. xshell支持图形_Xshell打不开图形化界面,或许该这样做!
  19. 从记账软件看工具类APP的存量运营之道
  20. 学习视频剪辑整理和所感

热门文章

  1. Extjs嵌入html
  2. updatePanle总结
  3. .NET下实现分布式缓存系统Memcached
  4. ASP.NET Form Authentication安全漏洞及对策
  5. 图解3种常见的深度学习网络结构:FC、CNN、RNN
  6. 干货 | 用Python做图像处理:图像导数实战
  7. 粘包拆包,Netty及远洋通信中的解决方案!超实用
  8. Java 几种常用 JSON 库性能比较
  9. 如何领导团队做好技术债管理?
  10. 凭运气接来的项目,怎样凭本事搞砸?