L2-2 老板的作息表

news2024/11/24 2:02:45

L2-2 老板的作息表

分数 25

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

zcy.png

新浪微博上有人发了某老板的作息时间表,表示其每天 4:30 就起床了。但立刻有眼尖的网友问:这时间表不完整啊,早上九点到下午一点干啥了?

本题就请你编写程序,检查任意一张时间表,找出其中没写出来的时间段。

输入格式:

输入第一行给出一个正整数 N,为作息表上列出的时间段的个数。随后 N 行,每行给出一个时间段,格式为:

hh:mm:ss - hh:mm:ss

其中 hhmmss 分别是两位数表示的小时、分钟、秒。第一个时间是开始时间,第二个是结束时间。题目保证所有时间都在一天之内(即从 00:00:00 到 23:59:59);每个区间间隔至少 1 秒;并且任意两个给出的时间区间最多只在一个端点有重合,没有区间重叠的情况。

输出格式:

按照时间顺序列出时间表中没有出现的区间,每个区间占一行,格式与输入相同。题目保证至少存在一个区间需要输出。

输入样例:

8
13:00:00 - 18:00:00
00:00:00 - 01:00:05
08:00:00 - 09:00:00
07:10:59 - 08:00:00
01:00:05 - 04:30:00
06:30:00 - 07:10:58
05:30:00 - 06:30:00
18:00:00 - 19:00:00

输出样例:

04:30:00 - 05:30:00
07:10:58 - 07:10:59
09:00:00 - 13:00:00
19:00:00 - 23:59:59

代码长度限制

16 KB

Java (javac)

时间限制

900 ms

内存限制

128 MB

Python (python3)

时间限制

300 ms

内存限制

64 MB

其他编译器

时间限制

200 ms

内存限制

64 MB


我的答案:

一、信息

题目要求找出一个时间表中未列出的时间段。

二、分析

  1. 将所有时间段按开始时间排序。
  2. 对每一个时间段,比较其开始时间与上一个时间段的结束时间,以找出未列出的区间。
  3. 记录下这些区间并在最后输出。

三、算法设计

  1. 定义一个结构体Time,其中包含开始时间和结束时间。
  2. 将所有时间段存储在一个Time数组中。
  3. 对Time数组按开始时间进行排序。
  4. 遍历数组,对于每个时间段,比较其开始时间与上一个时间段的结束时间,记录下未列出的时间段。

四、代码实现(用C++)

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct Time {
    int start, end;
    bool operator<(const Time &t) const {
        return start < t.start;
    }
};

int convert(const string &s) {
    return stoi(s.substr(0, 2)) * 3600 + stoi(s.substr(3, 2)) * 60 + stoi(s.substr(6, 2));
}

string convertBack(int time) {
    char buffer[10];
    sprintf(buffer, "%02d:%02d:%02d", time / 3600, (time % 3600) / 60, time % 60);
    return buffer;
}

int main() {
    int N;
    cin >> N;
    vector<Time> times(N);
    for(int i = 0; i < N; i++) {
        string s, e, tmp;
        cin >> s >> tmp >> e;
        times[i].start = convert(s);
        times[i].end = convert(e);
    }
    sort(times.begin(), times.end());

    int lastTime = 0;
    for(const auto &t : times) {
        if(t.start - lastTime >= 1) {
            cout << convertBack(lastTime) << " - " << convertBack(t.start) << endl;
        }
        lastTime = max(lastTime, t.end);
    }

    if(lastTime < 24 * 3600 - 1) {
        cout << convertBack(lastTime) << " - " << "23:59:59" << endl;
    }

    return 0;
}

五、实现代码过程中可能遇到的问题

  1. 时间格式的转换可能会出现问题,要确保正确地从字符串格式转换为整数格式,反之亦然。
  2. 在对时间段进行排序后,需要确保正确地识别并输出所有的空白时间段。
  3. 注意处理时间段的边界情况,例如00:00:00和23:59:59。

正确答案:

一、信息 题目要求检查一个时间表,找出其中未列出的时间段。

二、分析

  1. 所有的时间段都存储在一个pair中,其中第一个元素是开始时间,第二个元素是结束时间。
  2. 时间段首先按照开始时间排序,这样我们可以从最早的时间段开始遍历,直到一天的结束。

三、算法设计

  1. 输入所有时间段,并存储在vector<pair<string,string>>中。
  2. 使用sort函数对所有时间段按开始时间进行排序。
  3. 从"00:00:00"开始,检查每一个时间段,看它是否与前一个时间段重叠或连续。
  4. 如果发现有空白时间段,即当前时间段的开始时间不等于上一个时间段的结束时间,则输出空白时间段。
  5. 遍历结束后,检查最后一个时间段的结束时间是否为"23:59:59"。如果不是,则输出从最后一个时间段的结束时间到"23:59:59"的空白时间段。

四、代码实现(用C++)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<pair<string, string>> intervals;

    for(int i = 0; i < n; i++) {
        string start, hyphen, end;
        cin >> start >> hyphen >> end;
        intervals.push_back({start, end});
    }

    sort(intervals.begin(), intervals.end());

    string lastEnd = "00:00:00";
    for(const auto &interval : intervals) {
        if(interval.first != lastEnd) {
            cout << lastEnd << " - " << interval.first << endl;
        }
        lastEnd = interval.second;
    }

    if(lastEnd != "23:59:59") {
        cout << lastEnd << " - " << "23:59:59" << endl;
    }

    return 0;
}

五、实现代码过程中可能遇到的问题

  1. 时间段可能是连续或重叠的。例如,一个时间段从"08:00:00"到"09:00:00",接下来的时间段可能从"09:00:00"开始或更早。
  2. 如果不按照开始时间对时间段进行排序,就不能正确找出所有的空白时间段。
  3. 需要注意边界条件,即一天的开始时间"00:00:00"和结束时间"23:59:59"。

七、我错哪了?

我的错误主要在于处理连续时间段的逻辑。当考虑两个连续的时间段时,我仅比较了当前时间段的开始时间与前一个时间段的结束时间,而未正确处理以下几点:

  1. 如果一个时间段的结束时间超过下一个时间段的开始时间,应该取两者中较大的结束时间作为下一个时间段的结束时间。
  2. 对于多个相互重叠或连续的时间段,应连续处理它们,直到找到一个不连续的时间段或时间段结束。

正确代码简洁地处理了上述问题,特别是对于连续或重叠的时间段。我的代码没有正确处理这种情况,所以可能会在某些测试用例上失败。

八、学到了什么?

从这道题目中,你可以学到以下几点:

一、问题分析与解题技巧

  1. 数据结构的选择:如何使用pairvector来有效地存储和处理时间段信息。
  2. 排序的重要性:通过将时间段按开始时间排序,可以简化后续的处理过程,确保逻辑的连续性和正确性。
  3. 边界条件的处理:如何处理一天的开始和结束时间,以确保所有的空白时间段都被考虑到。

二、编程技能与实践

  1. STL的应用:如何使用C++标准模板库中的sort函数和vector容器来简化编程任务。
  2. 字符串处理:如何处理和比较时间格式的字符串,以及如何进行格式化输出。

三、问题解决的策略与方法

  1. 逐步解决问题:首先处理输入数据,然后进行排序,接着逐步遍历时间段以找出所有的空白时间段。
  2. 利用已有的知识和技能:根据已知的数据结构和算法,设计一个简单且高效的解决方案。

四、反思与优化

  1. 简洁性与效率:有时,简单直接的方法可能比复杂的算法更加有效。例如,正确答案比我最初的答案更简洁且更易于理解。
  2. 测试与验证:在解决问题时,重要的是进行充分的测试,确保答案在各种情况下都是正确的。

五、通用性与应用性

  1. 通用问题解决方法:这种类型的问题——找出一系列区间中的空白区间——在实际应用中很常见,例如在日程安排或资源分配中。
  2. 学习与实践的结合:通过实际的编程问题,加深对某些编程概念或技巧的理解,这有助于你在未来的编程任务中更加熟练和自信。

总的来说,这道题目不仅提供了一个具体的编程挑战,而且也为我提供了一个反思和学习编程方法和策略的机会。

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

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

相关文章

30个前端和设计必备网站,让你的工作更轻松!

说在前面 当今互联网时代&#xff0c;前端开发和设计领域变化迅速&#xff0c;每天都会有新技术和工具不断涌现。无论你是一名前端工程师还是一名设计师&#xff0c;都需要不断了解最新的前沿技术和工具。下面是30个前端和设计经常会用到的网站&#xff0c;以及每个网站的功能介…

程序设计语言

编译解释 传参还是传值 编译原理

洛谷 B2029 大象喝水 C++代码

题目描述 AC Code #include<bits/stdc.h> using namespace std; int main() {int h,r;cin>>h>>r;double val;val3.14*r*r*h;int ans20000/val;ans;cout<<ans<<endl;return 0; }

Springmvc 讲解(1)

文章目录 前言一、SpringMvc1、简介2、核心组件和调用流程2.1 涉及组件的理解 3、小案例快速体验3.1场景需求3.1.1 导入依赖3.1.2 controller声明3.1.3 核心配置类3.1.4 环境搭建3.1.6 配置tomcat3.1.7 测试 二、SpringMvc 接收参数1.路径设置注解2、param接收参数四种类型2.1 …

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三)

前言&#xff1a; 万事开头难&#xff0c;如果我们在开发板上开发出第一个应用程序&#xff0c;第一个驱动程序&#xff0c;那么后续的开发就会稍微简单点&#xff0c;下面让我们来进行第一个应用程序和第一驱动程序的开发吧。 目录 一、开发板的第1个APP实验 1.通过Git仓库…

Day 13 python学习笔记

模块 内置模块 加密 加密是成本与时间的问题 不可逆加密 哈希加密&#xff0c;单向性&#xff0c;唯一性。 可逆加密 对称加密&#xff1a;加密与解密采用同一密匙&#xff08;如文件压缩时设置密码&#xff09; DES算法 非对称加密&#xff1a;采用一对密匙&#xff0c;公匙、…

邦邦资讯|邦邦机器人10月新鲜事来袭,请查收

01 邦邦机器人研发中心徐汇新址落成 立足新起点 实现新跨越 10月初&#xff0c;邦邦机器人成立徐汇研发中心&#xff0c;历时半年的策划、设计、讨论、施工&#xff0c;正式落定上海市徐汇区桂林路406号华鑫中心1号楼505室&#xff0c;“这是邦邦机器人发展史的又一座重要里程…

java代码审计-不安全的配置-Tomcat任意文件写入(CVE-2017-12615)

Tomcat任意文件写入&#xff08;CVE-2017-12615&#xff09; 影响范围&#xff1a;Apache Tomcat 7.0.0 - 7.0.79 (windows环境) 当 Tomcat 运行在 Windows 操作系统时&#xff0c;且启用了 HTTP PUT 请求方法&#xff08;例如&#xff0c;将 readonly 初始化参数由默认值设置…

部署K8S

防火强的初始化&#xff1a; [rootk8s-node-12 ~]# systemctl stop firewalld NetworkManager [rootk8s-node-12 ~]# systemctl disable firewalld NetworkManager Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service. Removed symlink /et…

【Android】MQTT入门——服务器部署与客户端搭建

目录 MQTT 协议简介应用场景优点缺点 部署服务端下载安装包启动服务器 搭建客户端下载SDK添加依赖配置MQTT服务和权限建立连接订阅主题发布消息取消订阅断开连接 MQTT客户端工具最终效果实现传感器数据采集与监测功能思路 MQTT 协议 简介 MQTT&#xff08;Message Queuing Te…

剑指JUC原理-6.wait notify

wait nofity 小故事 - 为什么需要 wait 由于条件不满足&#xff0c;小南不能继续进行计算 但小南如果一直占用着锁&#xff0c;其它人就得一直阻塞&#xff0c;效率太低 于是老王单开了一间休息室&#xff08;调用 wait 方法&#xff09;&#xff0c;让小南到休息室&#xf…

C++可视化 有穷自动机NFA 有穷自动机DFA

一、项目介绍 根据正则表达式,可视化显示NFA&#xff0c;DFA&#xff1b;词法分析程序 二、项目展示

洛谷 B2007 A+B问题 C++代码

目录 题目描述 AC Code 题目描述 AC Code #include<bits/stdc.h> using namespace std; typedef long long ll; int main() { int a,b;cin>>a>>b;cout<<ab<<endl;return 0; }

F5修复了允许远程代码执行攻击的BIG-IP认证绕过漏洞

图片 导语 近日&#xff0c;网络安全公司Praetorian Security的研究人员发现了一项影响F5 BIG-IP配置工具的严重漏洞&#xff0c;该漏洞被命名为CVE-2023-46747。攻击者可以通过远程访问配置工具来执行未经身份验证的远程代码&#xff0c;从而对系统进行攻击。本文将详细介绍该…

基于 Python 的个性化电影推荐系统的研究与实现

1 简介 本毕业设计的内容是设计并且实现一个电影个性化推荐系统。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&#xff0c;Python技术和Tomcat网络信息服务作为应用服务器。电影个性化推荐系统的功能已基本实现&#xff0c;主要实现首页&#xff0c;个人中心&#xf…

热力学第三定律

热力学第三定律能斯特定理 凝聚系的熵在等温过程中的改变随绝对温度趋于零 如果有 即有&#xff1a; 也就是说&#xff1a;当绝对温度趋于零时&#xff0c;熵和状态参量y无关。 普朗克绝对熵 当绝对温度趋于零时&#xff0c;一个化学均匀系统的熵趋向于一个极限值 也就是说&a…

【数据结构】面试OJ题——时间复杂度2

目录 一&#xff1a;移除元素 思路&#xff1a; 二&#xff1a;删除有序数组中的重复项 思路&#xff1a; 三&#xff1a;合并两个有序数组 思路1&#xff1a; 什么&#xff1f;你不知道qsort&#xff08;&#xff09; 思路2&#xff1a; 一&#xff1a;移除元素 27. 移…

离线语音通断器开发-稳定之后顺应新需求

使用云知声的US516p6方案开发了一系列的离线语音通断器&#xff0c;目前已经取得了不小的收获&#xff0c;有1路的&#xff0c;3路的&#xff0c;4路的&#xff0c;唛头和扬声器包括唛头线材也在不断的更新打磨中找到了效果特别好的供应商。 离线语音通断器&#xff0c;家用控…

【OpenCV实现平滑图像金字塔,轮廓:入门】

文章目录 概要图像金字塔轮廓&#xff1a;入门 概要 文章内容的概要&#xff1a; 平滑图像金字塔&#xff1a; 图像金字塔是什么&#xff1f; 图像金字塔是指将原始图像按照不同的分辨率进行多次缩小&#xff08;下采样&#xff09;得到的一系列图像。这种处理方式常用于图像…