您现在的位置是:首页 >技术教程 > 2023年第十四届蓝桥杯省赛C/C++大学C组试题B:工作时长网站首页技术教程
2023年第十四届蓝桥杯省赛C/C++大学C组试题B:工作时长
问题描述
小蓝手里有一份 20222022 年度自己的上班打卡记录文件,文件包含若干条打卡记录,每条记录的格式均为“yyyy-MM-dd HH:mm:ssyyyy-MM-dd HH:mm:ss”,即按照年-月-日 时:分:秒的形式记录着一个时间点(采用 2424 小时进制)。由于某些原因,这份文件中的时间记录并不是按照打卡的时间顺序记录的,而是被打乱了。但我们保证小蓝每次上班和下班时都会正常打卡,而且正好打卡一次,其它时候不会打卡。每一对相邻的上-下班打卡之间的时间就是小蓝本次的工作时长,例如文件内容如下的话:
2022-01-01 12:00:05
2022-01-02 00:20:05
2022-01-01 07:58:02
2022-01-01 16:01:35
表示文件中共包含了两段上下班记录,1)20222022-0101-0101 0707:5858:02∼202202∼2022-0101-0101 1212:0000:0505,工作时长为 1452314523 秒;2)20222022-0101-0101 1616:0101:35∼202235∼2022-0101-0202 0000:2020:0505,工作时长为 2991029910 秒;工作时长一共是 14523+29910=4443314523+29910=44433 秒。现在小蓝想知道在 20222022 年度自己的工作时长一共是多少秒?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
运行数据网址
https://labfile.oss.aliyuncs.com/courses/21074/records.txt
方法
这是一道与日期有关的模拟题。把每个时间都转化为与 2022-01-01 00:00:00 的差,后面再做排序和计算就方便了。
代码
#include<bits/stdc++.h>
using namespace std;
// 定义变量用于存储年、月、日、时、分、秒
int year, month, day, h, m, s;
// 定义数组存储每个月的天数,注意2月默认按平年28天计算
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 定义一个vector用于存储每个时间点距离'2022-01-01 00:00:00'的秒数
vector<int> v;
int main() {
// 将输入时间换算成距离'2022-01-01 00:00:00'的秒数
while (scanf("%d-%d-%d %d:%d:%d", &year, &month, &day, &h, &m, &s) == 6) {
int sum = 0;
// 计算从1月到当前月之前的所有月份的天数总和
for (int i = 1; i < month; ++i)
sum += days[i];
// 加上当前月的天数
sum += day;
// 将天数转换为小时数并加上当前小时数
sum = sum * 24 + h;
// 将小时数转换为分钟数并加上当前分钟数
sum = sum * 60 + m;
// 将分钟数转换为秒数并加上当前秒数
sum = sum * 60 + s;
// 在vector末尾添加一个新元素,即当前时间点距离'2022-01-01 00:00:00'的秒数
v.push_back(sum);
}
// 将换算成秒数后的时间按升序排序
sort(v.begin(), v.end());
int ans = 0;
// 相邻的每对时间为一次上下班的打卡记录,求每对的时间差再求和,就是工作时长
for (int i = 0; i < v.size(); i += 2)
ans += v[i + 1] - v[i];
// 输出工作时长
cout << ans;
return 0;
}
答案
5101913
代码运行

将运行数据输入完后随便输个符号再点Enter键就会出结果。
答案提交

其他解题方法

蓝桥云课还有一些关于Excel的解题方法,大家可以了解一下。
欢迎批评讨论。






U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结