国内某知名无人机技术公司软件开发岗位求有效工作时间题目

/*

1.1 要求:

在DJI的工时打卡计算系统中,一个工作日的定义是由工作当日当天的凌晨03:00:00开始,到隔天凌晨03:00:00(不包含)为止。这其中,工作日当天的中午12:30:00到下午14:00:00(不包含)为午休时间,不计入工作时间。

Tom由于工作繁忙,担心自己有时候会忘记打卡,因此他每次经过打卡机到时候都会不由自主地打一次卡。
为了更好的了解自己的工作情况,Tom找到了自己整个八月份的乱序打卡记录,
但是这些数据不小心弄乱了,所以Tom想请你帮个忙。
从给出的N条记录中,找出所有有效的打卡工作日(即在该工作日中打开次数>=2并且有效工作时间>0),
并计算该工作日中的有效工作时间(按秒计算,除去打开时间内出现的午休时间)。
其中工作日定义为当天3:00:00到次日2:59:59为当天工作日,
即当天 2:59:59(包括)以前的打开记录当作前一天打开记录和有效工作时间,

不计做当天的打开记录和有效工作时间。


1.2 输入:

12
08.10 01:00:00
08.09 23:59:59
08.10 17:00:00
08.10 18:00:00
08.01 01:00:00
08.01 04:00:00
08.03 10:00:00
08.03 12:29:59
08.04 10:00:00
08.04 12:30:00
08.07 01:00:00

08.07 02:00:00


1.3 输出:

08.03 8999
08.04 9000
08.06 3600
08.09 3601
08.10 3600

*/

//2 实现

#include "stdafx.h"
#include <iostream>
#include <string>
#include<vector>
using namespace std;


#define REST_START 45000 //60*60*12+30*60
#define REST_END 50400 //60*60*14
#define START 10800 //60*60*3
#define END 86400 //60*60*24
#define REST 5400 //REST_END-REST_START


//当天的有效工作时间为00:00~24:00(不含午休时间)到次日的00:00~03:00之间
int main()
{
int N;//数据量
vector<int>dayRecord[32]; //八月有1~31天
int workTime[32]; //记录每天的工作时间
cin >> N;
if (getchar() == '\n')
{
;
}
for (int i = 0; i < N; i++)
{
string str;
int day = 0, hour, minute, second, time;
getline(cin, str);
sscanf_s(str.c_str(), "08.%d %d:%d:%d", &day, &hour, &minute, &second);
time = 60 * 60 * hour + 60 * minute + second;
if (time > REST_START&&time < REST_END)//如果处于12:30~14:00休息时间段内
continue;
else if (time < START)  //如果处在00:00~02:59:59之间
{
dayRecord[day - 1].push_back(time + END - REST);
}
else if (time >= REST_END)
{
dayRecord[day].push_back(time - REST);
}
else
{
dayRecord[day].push_back(time);
}
}


for (int i = 1; i <= 31; i++) //计算每天的工作时间
{
int min = END + START,
max = 0,
size = dayRecord[i].size();
if (size < 2) //如果当天打开次数不够两次
{
continue;
}
for (int j = 0; j < size; j++)
{
if (dayRecord[i][j] < min)
min = dayRecord[i][j];//每天的第一次打卡一定是最小的
if (dayRecord[i][j] > max)
max = dayRecord[i][j];//每天的最后一次打卡一定是最大的
}
workTime[i] = max - min;
if (i < 10)
printf("08.0%d %d\n", i, workTime[i]);
else
printf("08.%d %d\n", i, workTime[i]);
}
system("pause");
return 0;

}


//运行结果


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸡啄米的时光机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值