洛谷P13893 [蓝桥杯 2023 省 C] 工作时长
P13893 [蓝桥杯 2023 省 C] 工作时长
题目描述
小蓝手里有一份 2022 年度自己的上班打卡记录文件,文件包含若干条打卡记录,每条记录的格式均为“yyyy-MM-dd HH:mm:ss”,即按照年-月-日时:分:秒的形式记录着一个时间点(采用 24 小时进制)。由于某些原因,这份文件中的时间记录并不是按照打卡的时间顺序记录的,而是被打乱了。但我们保证小蓝每次上班和下班时都会正常打卡,而且正好打卡一次,其它时候不会打卡。每一对相邻的上-下班打卡之间的时间就是小蓝本次的工作时长,例如文件内容如下的话:
- 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)2022-01-01 07:58:02 ~ 2022-01-01 12:00:05,工作时长为 \(14523\) 秒;2)2022-01-01 16:01:35 ~ 2022-01-02 00:20:05,工作时长为 \(29910\) 秒;工作时长一共是 \(14523 + 29910 = 44433\) 秒。现在小蓝想知道在 2022 年度自己的工作时长一共是多少秒?
输入格式
无
输出格式
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只输出这个整数,填写多余的内容将无法得分。
输入输出样例 #1
输入 #1
输出 #1
题目链接
https://www.luogu.com.cn/problem/P13893
解题思路
- 按日期时间排序,每两个作差得到一次上班时间
- 由于并没有说出工作时间有没有跨月日,所以要考虑上
- 注意这里有个小彩蛋,数据条数为520
代码实现
// 模拟
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int n=520;
ll ans;
struct node{
int y,m,d,h,mi,s;
};
vector<node>a(n);
bool cmp(node a,node b){
if(a.y!=b.y)return a.y<b.y;
if(a.m!=b.m)return a.m<b.m;
if(a.d!=b.d)return a.d<b.d;
if(a.h!=b.h)return a.h<b.h;
if(a.mi!=b.mi)return a.mi<b.mi;
return a.s<b.s;
}
ll to_sec(node t){
//计算t距离2022?01?01的总秒数
int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
ll day=0;
for(int i=1;i<t.m;i++) day+=month[i];
day+=t.d-1;
ll s=day*24*3600+t.h*3600+t.mi*60+t.s;
return s;
}
int main()
{
for(int i=0;i<n;i++){
scanf("%d-%d-%d %d:%d:%d",&a[i].y,&a[i].m,&a[i].d,&a[i].h,&a[i].mi,&a[i].s);
}
sort(a.begin(),a.end(),cmp);
for(int i=0;i<n;i+=2){
ll t1=to_sec(a[i]);
ll t2=to_sec(a[i+1]);
ans+=t2-t1;
}
cout<<ans<<'\n';
return 0;
}
浙公网安备 33010602011771号