打卡系统统计

题目

在XX的工时打卡计算系统中,一个工作日的定义是由工作当日当天的凌晨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(包括)以前的打卡记录当作前一天打开记录和有效工作时间,不计做当天的打开记录和有效工作时间。

输入
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

输出
08.03 8999
08.04 9000
08.06 3600
08.09 3601
08.10 3600

 

#include<stdio.h>
#include<iostream>
#include<vector>

#define REST_START 12*60*60+30*30
#define REST_END 14*60*60
#define START 3*60*60
#define END 60*60*24
#define REST 1*60*60+30*60


using namespace std;

int main()
{
    int N;
    vector<int> dayRecord[32];
    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(str.c_str(),"08.%d %d:%d:%d",&day,&hour,&minute,&second);
        time=hour*60*60+minute*60+second;

        if(time>=REST_START && time<REST_END)
            dayRecord[day].push_back(REST_START);
        else if(time<START)
        {
            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<32;i++)
    {
        int min_=END+START;
        int max_=0;
        int 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(0==workTime[i])
        {
            continue;
        }
        if(i<10)
        {
            printf("08.0%d %d\n",i,workTime[i]);
        }
        else
            printf("08.%d %d\n",i,workTime[i]);
    }


   return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值