当前位置: 首页 > article >正文

PTA天梯赛L2-042题保姆级攻略:用C++ STL vector和sort轻松找出老板作息表的‘摸鱼’时间

PTA天梯赛L2-042题解用侦探思维破解老板的摸鱼时间最近在PTA天梯赛的题库中有一道关于时间区间处理的题目引起了我的注意。题目描述了一位老板在网上晒出自己的作息时间表却被眼尖的网友发现存在时间空白。这让我想起了一个有趣的比喻我们就像数字侦探要从看似完整的时间表中找出那些被刻意隐藏的摸鱼时刻。这道题编号L2-042考察的核心是如何处理不连续的时间区间并找出其中的空白。对于准备算法竞赛的同学来说这不仅是练习STL使用的绝佳机会更是培养问题分解能力的典型案例。下面我将从解题思路、代码实现到优化技巧带你一步步揭开这道题的神秘面纱。1. 问题分析与建模首先我们需要明确题目的具体要求。给定N个时间段每个时间段格式为hh:mm:ss - hh:mm:ss要求找出一天中未被这些时间段覆盖的所有区间。这些区间需要按时间顺序输出且题目保证输入的时间段不会重叠。关键观察点所有时间都在00:00:00到23:59:59之间输入区间按任意顺序给出相邻区间可能有端点重合如A区间结束于08:00:00B区间开始于08:00:00需要检查三个边界开始前、中间间隙、结束后我们可以将这个问题建模为在时间线上寻找空隙的过程。想象一条从00:00:00到23:59:59的时间轴上面已经标记了一些线段输入的时间段我们的任务是找出所有未被线段覆盖的部分。2. 解题思路与算法设计解决这个问题的关键在于如何高效地处理时间区间并找出间隙。以下是详细的思考过程2.1 输入处理与存储首先需要将输入的时间段存储起来。由于题目中的时间都是字符串格式我们可以直接使用vectorstring来保存原始输入。但更高效的做法是将时间转换为秒数方便比较和排序。struct Time { int h, m, s; int toSeconds() const { return h * 3600 m * 60 s; } }; vectorpairTime, Time timeIntervals;2.2 时间区间排序未排序的时间区间难以处理我们需要先按开始时间进行排序bool compareIntervals(const pairTime, Time a, const pairTime, Time b) { return a.first.toSeconds() b.first.toSeconds(); } sort(timeIntervals.begin(), timeIntervals.end(), compareIntervals);2.3 寻找间隙的算法排序后我们可以按顺序检查相邻区间之间的间隙检查第一个区间是否从00:00:00开始检查相邻两个区间之间是否有间隙检查最后一个区间是否到23:59:59结束算法伪代码if 第一个区间的开始 00:00:00 输出 00:00:00 - 第一个区间的开始 for 每个相邻的区间对 (A, B): if A的结束 B的开始 输出 A的结束 - B的开始 if 最后一个区间的结束 23:59:59 输出 最后一个区间的结束 - 23:59:593. 完整代码实现与解析基于上述思路我们可以实现完整的解决方案。以下是使用C STL的详细代码#include iostream #include vector #include algorithm using namespace std; struct Time { int h, m, s; static Time fromString(const string str) { Time t; sscanf(str.c_str(), %d:%d:%d, t.h, t.m, t.s); return t; } int toSeconds() const { return h * 3600 m * 60 s; } string toString() const { char buffer[9]; sprintf(buffer, %02d:%02d:%02d, h, m, s); return string(buffer); } }; void printGap(const Time start, const Time end) { cout start.toString() - end.toString() endl; } int main() { int N; cin N; cin.ignore(); // 消耗换行符 vectorpairTime, Time intervals; for (int i 0; i N; i) { string line; getline(cin, line); Time start Time::fromString(line.substr(0, 8)); Time end Time::fromString(line.substr(11, 8)); intervals.emplace_back(start, end); } // 按开始时间排序 sort(intervals.begin(), intervals.end(), [](const auto a, const auto b) { return a.first.toSeconds() b.first.toSeconds(); }); // 检查开始前的间隙 Time dayStart Time{0, 0, 0}; if (intervals[0].first.toSeconds() dayStart.toSeconds()) { printGap(dayStart, intervals[0].first); } // 检查中间间隙 for (size_t i 0; i intervals.size() - 1; i) { const auto curr intervals[i]; const auto next intervals[i1]; if (curr.second.toSeconds() next.first.toSeconds()) { printGap(curr.second, next.first); } } // 检查结束后的间隙 Time dayEnd Time{23, 59, 59}; if (intervals.back().second.toSeconds() dayEnd.toSeconds()) { printGap(intervals.back().second, dayEnd); } return 0; }代码关键点解析Time结构体封装了时间处理逻辑包括字符串转换和秒数计算使用vectorpairTime, Time存储时间区间比直接处理字符串更清晰排序使用lambda表达式按开始时间的秒数比较三个检查步骤分别处理开始前、中间和结束后的间隙4. 优化与边界条件处理在实际编码中我们需要特别注意一些边界条件和可能的优化点4.1 输入处理优化原始代码中直接使用字符串比较虽然简单但不够健壮。我们改进后的版本将时间转换为结构体具有以下优势更清晰的类型系统更容易进行时间计算和比较减少字符串操作错误4.2 边界条件检查需要特别注意以下几种边界情况只有一个时间区间的情况时间区间正好从00:00:00开始或到23:59:59结束相邻区间端点恰好重合的情况题目保证不会重叠但可能端点重合测试用例示例输入 1 12:00:00 - 13:00:00 输出 00:00:00 - 12:00:00 13:00:00 - 23:59:594.3 性能分析时间复杂度O(N log N)主要由排序步骤决定空间复杂度O(N)存储所有时间区间对于PTA天梯赛的数据规模(N ≤ 1000)这个算法完全足够5. 常见错误与调试技巧在解决这类区间问题时初学者常会遇到一些典型错误5.1 时间比较错误直接使用字符串比较时间可能导致错误结果// 错误示例字符串比较 if (08:59:59 09:00:00) // 可能正确但不推荐正确做法是转换为秒数或使用专门的时间结构体比较。5.2 区间端点处理不当题目说明区间至少间隔1秒且不会重叠但可能有端点重合。例如07:10:59 - 08:00:00 08:00:00 - 09:00:00这两个区间是连续的中间没有间隙不应输出。5.3 输入格式处理使用getline读取输入时需要注意处理换行符cin N; cin.ignore(); // 消耗掉数字后的换行符5.4 输出格式要求输出必须严格匹配题目要求的格式包括前导零和分隔符04:30:00 - 05:30:00 // 正确 4:30:0 - 5:30:0 // 错误6. 扩展思考与实际应用这道题目虽然来自算法竞赛但其核心思想在实际开发中有广泛应用日程安排系统检测用户日程表中的空闲时间段资源预订系统找出未被预订的时间段日志分析识别系统活动中的静默期网络监控发现服务中断的时间窗口理解这类区间处理问题的通用解法可以帮助我们解决许多实际问题。例如在处理会议室预订系统时类似的算法可以用来查找可用的时间段。进一步挑战如果时间区间可能重叠如何合并区间后再找间隙如果需要处理跨越多天的时间段算法该如何调整如何优化算法以处理大规模数据如N 1,000,0007. 竞赛技巧与STL使用心得在算法竞赛中合理使用STL可以大幅提高编码效率和正确率。对于这道题我们主要使用了vector动态数组存储时间区间sort对区间进行排序pair组合开始和结束时间STL使用建议熟悉常用容器的接口和特性掌握自定义比较函数的方法lambda表达式很实用注意迭代器的有效性和边界条件对于复杂数据结构考虑定义辅助类型如我们的Time结构体在最近的PTA天梯赛中这类考察基础数据结构应用和问题分解能力的题目越来越常见。通过这道题我们不仅学会了如何处理时间区间更重要的是培养了将实际问题抽象为计算模型的能力。

相关文章:

PTA天梯赛L2-042题保姆级攻略:用C++ STL vector和sort轻松找出老板作息表的‘摸鱼’时间

PTA天梯赛L2-042题解:用侦探思维破解老板的"摸鱼"时间 最近在PTA天梯赛的题库中,有一道关于时间区间处理的题目引起了我的注意。题目描述了一位老板在网上晒出自己的作息时间表,却被眼尖的网友发现存在时间空白。这让我想起了一个有…...

【企业级低代码内核调试SOP】:7类典型NPE/ClassDefNotFound场景对照表,含JFR采样+Arthas增强脚本

更多请点击: https://intelliparadigm.com 第一章:企业级低代码内核调试SOP概述 企业级低代码平台的内核调试并非传统应用开发的简单延伸,而是融合了元数据驱动、可视化编排、运行时沙箱与动态渲染引擎的复合型工程实践。其SOP(标…...

别光看虚拟线程了!Java 21 里这个‘字符串模板’预览特性,能让你的代码清爽一大截

别光看虚拟线程了!Java 21 里这个‘字符串模板’预览特性,能让你的代码清爽一大截 如果你是一位长期与Java打交道的开发者,最近可能被Java 21的虚拟线程(Virtual Threads)刷屏了。这个特性确实令人兴奋,但今…...

C#实战:用滚球算法搞定点云凹包,GIS和游戏地形都能用

C#实战:用滚球算法实现点云凹包,解锁GIS与游戏地形新玩法 当我们需要从一堆散乱的点数据中勾勒出它们的边界轮廓时,凸包算法往往是最先想到的解决方案。但现实世界中的形状很少是完美的凸多边形——海岸线的蜿蜒、城市边界的曲折、游戏地形的…...

避坑指南:从HuggingFace下载模型到llama.cpp量化,我踩过的那些‘坑’(含CUDA 12.2环境配置)

避坑指南:从HuggingFace下载模型到llama.cpp量化实战全解析 在部署大语言模型的过程中,从模型下载到最终量化部署,每个环节都可能隐藏着各种"坑"。本文将分享我在实际项目中积累的经验教训,特别是那些官方文档中鲜少提及…...

用Python和PySide6打造你的专属量化看盘工具:从K线到MACD的完整绘图实战

用Python和PySide6打造你的专属量化看盘工具:从K线到MACD的完整绘图实战 在量化交易的世界里,数据可视化是决策过程中不可或缺的一环。想象一下,当你需要快速验证一个交易策略的有效性,或者实时监控市场动态时,一个能够…...

别再只算公式了!聊聊NTC测温里ADC误差、滤波和TL431稳压的那些‘坑’

别再只算公式了!聊聊NTC测温里ADC误差、滤波和TL431稳压的那些‘坑’ 当你在产品验收报告上签下"0.5℃精度达标"时,是否注意到测试环境恒温箱的波动只有0.1℃?这个行业里心照不宣的秘密,正是我今天要拆解的技术真相。三…...

Go语言AI编程助手实战:golang-skills提升代码质量与开发效率

1. 项目概述:当AI助手遇上Go语言开发最近在GitHub上闲逛,发现了一个挺有意思的项目叫golang-skills。作为一个写了快十年Go的老码农,我对任何号称能提升Go代码质量的工具都抱有天然的好奇心。这个项目本质上是一个AI驱动的技能包,…...

CMMI在系统软件开发中的核心价值与实施策略

1. CMMI在系统软件开发中的核心价值解析在嵌入式系统和复杂软件产品的开发过程中,我们经常面临这样的困境:明明每个工程师都很优秀,但项目交付时总会出现需求遗漏、集成故障或质量波动。2009年我在参与某航天控制系统开发时,项目组…...

LaTeX表格进阶:除了\toprule和\bottomrule,booktabs宏包里\cmidrule和\addlinespace的隐藏用法与实战场景

LaTeX表格进阶:booktabs宏包中\cmidrule与\addlinespace的高阶应用指南 如果你已经熟悉booktabs宏包的基础三线表用法,却总觉得表格排版还差点意思——比如分组数据展示不够清晰、复杂表格结构难以驾驭,或者行间距控制不够精细——那么这篇文…...

告别NVS限制:手把手教你为ESP32设计自定义参数表并读写Flash(附完整代码)

突破NVS瓶颈:ESP32自定义参数表设计与Flash高效存储实战 在物联网设备开发中,参数存储是每个嵌入式工程师必须面对的基础问题。ESP32虽然提供了NVS(Non-Volatile Storage)库作为默认解决方案,但当项目复杂度提升时——…...

基于Dev Containers构建标准化开发环境:从Docker镜像到团队协作实践

1. 项目概述:一个为开发者量身定制的容器化开发环境如果你和我一样,每天的工作离不开写代码、调试、构建,那么你一定对“环境配置”这件事深恶痛绝。新同事入职,光是配环境就得花上半天甚至一天;换一台新电脑&#xff…...

SLM-V3架构:四通道检索与信息几何的下一代信息检索系统

1. SLM-V3架构概述:下一代信息检索系统的设计哲学在信息爆炸的时代,检索系统正面临前所未有的挑战。传统基于关键词匹配的检索方式已经难以满足用户对精准度和语义理解的需求。SLM-V3架构正是在这样的背景下应运而生,它通过四通道检索机制与信…...

从针灸学习网站到Vue3项目:我是如何用VSCode+Element Plus快速搭建前端原型的

从针灸学习网站到Vue3项目:我是如何用VSCodeElement Plus快速搭建前端原型的 去年冬天,我在学习中医针灸时萌生了一个想法:能否开发一个交互式学习平台,将经络穴位可视化?这个念头让我重新拾起前端开发技能。经过两周的…...

NerVE框架:大模型非线性特征动态分析与应用实践

## 1. 项目背景与核心价值NerVE框架的提出源于大语言模型(LLM)前馈网络中一个长期被忽视的研究盲区——非线性特征谱的动态演化规律。传统神经网络分析往往聚焦于权重矩阵的静态特征,而忽视了前馈层中ReLU等激活函数引入的动态非线性效应。我…...

ARM嵌入式单元测试实战与Tessy框架解析

1. ARM嵌入式单元测试的核心挑战在ARM嵌入式开发领域,单元测试面临着与传统PC软件开发截然不同的技术困境。我曾参与过多个基于Cortex-M系列的汽车电子项目,最深刻的体会就是:当你的代码需要直接操作寄存器控制刹车系统时,一个简单…...

基于LLM的代码摘要工具Codebreif:原理、部署与应用场景解析

1. 项目概述:一个为开发者“减负”的代码摘要工具最近在折腾一个老项目,想把里面几个核心模块的逻辑理清楚,结果一打开文件,好家伙,一个文件几千行,函数套函数,注释还都是十年前的老古董&#x…...

GLA与Mamba2:矩阵值循环状态在长序列建模中的创新应用

1. 项目概述在深度学习领域,循环神经网络(RNN)架构的演进一直是研究热点。最近出现的GLA(Global Linear Attention)和Mamba2两种新型RNN架构,通过引入矩阵值循环状态这一创新设计,在长序列建模任务中展现出显著优势。这两种架构都采用了状态空…...

不止于安装:用TwinCAT3实现PC与传感器TCP/IP通信的完整实战(从IP设置到数据解析)

不止于安装:用TwinCAT3实现PC与传感器TCP/IP通信的完整实战(从IP设置到数据解析) 在工业自动化领域,数据采集的可靠性和实时性往往决定了整个系统的性能上限。许多工程师在完成TwinCAT3基础安装后,常陷入"工具在手…...

LLM任务理解评估:动机分析与TF-IDF增强技术

1. 项目背景与核心价值在大语言模型(LLM)应用落地的过程中,我们经常遇到一个关键问题:如何量化评估模型对任务的理解程度?传统基于结果准确率的评估方式存在明显滞后性,且无法区分"蒙对"和"…...

如何实现开发工具配置的跨设备无缝同步:Claude Code多终端一致性方案终极指南

如何实现开发工具配置的跨设备无缝同步:Claude Code多终端一致性方案终极指南 【免费下载链接】claude-code Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tas…...

视觉AI虚拟训练平台SPHINX:从原理到工业应用

1. 项目概述:当视觉AI遇上虚拟沙盒SPHINX本质上是一个为视觉AI训练量身定制的数字实验室。就像儿童通过乐高积木理解物理规律一样,这个平台让机器学习模型在高度可控的虚拟环境中完成"感知-推理-决策"的闭环训练。不同于传统依赖海量真实数据的…...

Java向量API配置全链路解析(从-Djdk.incubator.vector.API=enable到RuntimeFeature检测失效的底层真相)

更多请点击: https://intelliparadigm.com 第一章:Java向量API配置全链路解析导论 Java向量API(JEP 438)是Project Panama的重要成果,旨在通过硬件级SIMD指令加速数值计算。其配置并非简单的依赖引入,而是…...

规范即代码:统一代码治理引擎canon的设计与实践

1. 项目概述:一个面向开发者的“规范”引擎在软件开发的世界里,我们每天都在和代码打交道。从命名一个变量,到设计一个API接口,再到编写一行注释,看似随意的选择背后,其实都隐含着某种“规范”。这些规范&a…...

SK-Adapter:骨架控制驱动的3D生成技术解析与实践

1. 项目概述:当3D生成遇到骨架控制在3D内容创作领域,生成模型正以前所未有的速度改变着工作流程。但传统方法往往面临一个核心痛点:生成结果的结构可控性不足。这正是SK-Adapter试图解决的问题——通过引入骨架(Skeleton&#xff…...

从AMD EPYC到Intel Xeon:聊聊现代多路服务器里,NUMA架构对数据库和虚拟化性能的实际影响

从AMD EPYC到Intel Xeon:现代多路服务器NUMA架构对数据库与虚拟化的深度影响 在数据中心基础设施的选型与优化中,处理器的NUMA(Non-Uniform Memory Access)架构设计往往是被低估的关键因素。当我们在AMD EPYC 7763和Intel Xeon Pl…...

基于Asterisk AGI与ChatGPT构建智能语音交互系统

1. 项目概述:当传统电话系统遇上AI大脑最近在折腾一个挺有意思的玩意儿,把Asterisk这个老牌的开源电话交换系统(PBX)和ChatGPT的API给接上了。简单说,就是让电话那头的人,能直接跟一个AI语音助手聊天。这可…...

音频-视觉协同定位技术:从原理到实践

1. 项目概述:当机器学会用耳朵和眼睛协同工作去年调试一个智能安防机器人时,我遇到个棘手问题:当监控区域同时出现玻璃破碎声和婴儿啼哭,系统总是错误地把声源定位在墙面反射位置。这个痛点促使我开始研究多模态感知的融合方案——…...

ARM SME架构MOVA指令:矩阵运算与AI加速实战

1. ARM SME架构与MOVA指令概述在Armv9架构中,SME(Scalable Matrix Extension)作为革命性的矩阵运算扩展,彻底改变了处理器处理大规模数据并行计算的方式。MOVA指令作为其中的数据传输核心,在向量寄存器与ZA&#xff08…...

AI Tools Client:连接ComfyUI与本地LLM的桌面创作中心实战指南

1. 项目概述:一个为本地AI实验室设计的“乐高式”创作前端 如果你和我一样,对Stable Diffusion、ComfyUI、Ollama这些本地AI工具着迷,但又厌倦了在浏览器标签页、命令行窗口和一堆JSON配置文件之间来回切换,那么SethRobinson的“…...