PTA L1-043 阅览室(详解)

2023-11-01 10:30
文章标签 详解 l1 pta 043 阅览室

本文主要是介绍PTA L1-043 阅览室(详解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:内容包括四大模块:题目,代码实现,大致思路,代码解读

 题目:

天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。

注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。

输入格式:

输入在第一行给出一个正整数N(≤10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:

书号([1, 1000]内的整数) 键值SE) 发生时间hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)

每一天的纪录保证按时间递增的顺序给出。

输出格式:

对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。

输入样例:

3
1 S 08:10
2 S 08:35
1 E 10:00
2 E 13:16
0 S 17:00
0 S 17:00
3 E 08:10
1 S 08:20
2 S 09:00
1 E 09:20
0 E 17:00

输出样例:

2 196
0 0
1 60

代码实现: 

#include<stdio.h>
int main()
{int n = 0;scanf("%d", &n);int i = 0;for (i = 0; i < n; i++){int id = 0;char ch = 0;int h = 0;int m = 0;scanf("%d %c %d:%d", &id, &ch, &h, &m);int arr[1001][2] = { 0 };int count = 0;int sumtime = 0;while (id){if (ch == 'S'){arr[id][0] = 1;arr[id][1] = h * 60 + m;}else if (ch == 'E' && arr[id][0] == 1){count++;sumtime += h * 60 + m - arr[id][1];arr[id][0] = 0;}scanf("%d %c %d:%d", &id, &ch, &h, &m);}if (count == 0){printf("0 0\n");}else{printf("%d %.0f\n", count, 1.0 * sumtime / count);}}return 0;
}

大致思路: 

1. 1借1还才算作一次借书

2. 创建一个二维数组,二维数组可以看作是一个一个的一维数组组成

    一个一维数组有两个空间:一个用于标记S过的书(即借出的书)

                                               一个用于存储此书借阅的开始时间(全部化作分钟数)

3. 若是借出去的书还回来,则借书次数+1

代码解读:

part 1:

 for (i = 0; i < n; i++)

  for循环表示N天的纪录

part 2:一天的读者借书次数统计+平均阅读时间                                   

        int id = 0;char ch = 0;int h = 0;int m = 0;scanf("%d %c %d:%d", &id, &ch, &h, &m);int arr[1001][2] = { 0 };int count = 0;int sumtime = 0;while (id){if (ch == 'S'){arr[id][0] = 1;arr[id][1] = h * 60 + m;}else if (ch == 'E' && arr[id][0] == 1){count++;sumtime += h * 60 + m - arr[id][1];arr[id][0] = 0;}scanf("%d %c %d:%d", &id, &ch, &h, &m);}if (count == 0){printf("0 0\n");}else{printf("%d %.0f\n", count, 1.0 * sumtime / count);}

    for循环内部:某一天的读者借书次数和平均阅读时间

    1. 读取一次借书数据,若是键值为S,则标记此书已被借阅:以此书号作为二维数组一行的数组名,在其第一个空间内置1

         同时记录此书开始借阅的时刻:在其第二个空间内存储当前时刻转化成的分钟数

2. 若是键值为E,且此书是当天借出的(即其作为数组名所对应的第一个空间内值为1)

    则借书次数+1,同时将借阅此书的时间段算在总的阅读时间内,然后必须将其第一个空间内的1置0,表示此书已经还回

注意:若是不将此书对应数组的第一个空间内容置1,则不能规避特殊情况的影响:

           假设一本书第一天借,第二天还,这样是不记借书次数的

           但是我们不将内容置1,则第二天的借书次数会把这一次不该记上的借书次数记上

            因为符合记录次数的条件:键值为1,且此书被借出了

3. 再次读取下一个借书数据,此时需要构成循环:

    根据书号的值,判断是否需要进行读者借书次数的统计和所有读者阅读总时间的计算

    我们写成while循环,条件就是书号的值,若是读取的书号不为0,则判断此书能否作为一次借书次数,及能否算上它的阅读时间,当书号为0时,结束循环,这样能判断一天所有的借书数据

4. while循环结束后,一天的借书次数已统计好,一天的阅读总时间也算好

     由于平均的阅读时间可能是小数,但是题目要求是整数,故而需要四舍五入去掉小数点,可以使用:%.0f

这篇关于PTA L1-043 阅览室(详解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/322328

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

LabVIEW FIFO详解

在LabVIEW的FPGA开发中,FIFO(先入先出队列)是常用的数据传输机制。通过配置FIFO的属性,工程师可以在FPGA和主机之间,或不同FPGA VIs之间进行高效的数据传输。根据具体需求,FIFO有多种类型与实现方式,包括目标范围内FIFO(Target-Scoped)、DMA FIFO以及点对点流(Peer-to-Peer)。 FIFO类型 **目标范围FIFO(Target-Sc

019、JOptionPane类的常用静态方法详解

目录 JOptionPane类的常用静态方法详解 1. showInputDialog()方法 1.1基本用法 1.2带有默认值的输入框 1.3带有选项的输入对话框 1.4自定义图标的输入对话框 2. showConfirmDialog()方法 2.1基本用法 2.2自定义按钮和图标 2.3带有自定义组件的确认对话框 3. showMessageDialog()方法 3.1

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓

OmniGlue论文详解(特征匹配)

OmniGlue论文详解(特征匹配) 摘要1. 引言2. 相关工作2.1. 广义局部特征匹配2.2. 稀疏可学习匹配2.3. 半稠密可学习匹配2.4. 与其他图像表示匹配 3. OmniGlue3.1. 模型概述3.2. OmniGlue 细节3.2.1. 特征提取3.2.2. 利用DINOv2构建图形。3.2.3. 信息传播与新的指导3.2.4. 匹配层和损失函数3.2.5. 与Super