欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Codeforces 16D Logging 题解

程序员文章站 2022-07-07 15:26:17
...

Codeforces 16D Logging 题解

题目

Codeforces 16D Logging 题解原题链接

题意

根据日志计算日志最小间隔天数,一分钟只能生成10条记录。


代码

#include <bits/stdc++.h>
using namespace std;
int ctoi (char x)
{
    return x-'0';
}
int main() {
    char str[100][200];
    vector<int> str24;
    int n,temp;
    cin>>n;
    getchar();
    for (int tmp=0;tmp<n;tmp++)
    {
        gets(str[tmp]);
        temp=0;
        if (str[tmp][7]=='a')
        {
            if (str[tmp][1]=='1'&&str[tmp][2]=='2')
                temp+=ctoi(str[tmp][4])*10+ctoi(str[tmp][5]);
            else temp+=ctoi(str[tmp][1])*10*60+ctoi(str[tmp][2])*60+ctoi(str[tmp][4])*10+ctoi(str[tmp][5]);
        }
        else{
            if (str[tmp][1]=='1'&&str[tmp][2]=='2')
                temp+=12*60+ctoi(str[tmp][4])*10+ctoi(str[tmp][5]);
            else temp+=12*60+ctoi(str[tmp][1])*10*60+ctoi(str[tmp][2])*60+ctoi(str[tmp][4])*10+ctoi(str[tmp][5]);
        }
        str24.push_back(temp);
    }
    int day=1,count=1,def=str24[0];
    for (int i=1;i<n;i++)
    {
        if (str24[i]==def) 
        {
            count++;
        }
        else if (str24[i]<def)
        {
            count=1;
            day++;
        }
        else count=1;
        if (count>10)
        {
            count=1;
            day++;
        }
        def=str24[i];
    }
    cout<<day;
    return 0;
}

思路

首先将所有日志时间转为分钟,再进入循环比较,将本次的与上一个比较,如果结果<0则加一天,等于0则在计数器上加1,计数器满10进一天,注意凌晨12点是12:00 am,计数器和天数刚开始都要是1即可(初始比较点本就要算一个,计数器是用来记录一个值出现的次数的;有日志天数至少是1)。


总结

本题2000分,注意考虑三个点:凌晨12点之后算新的一天(不包括12点);计数器如何计数;要将12小时制转换成分钟数来方便比较。本题思路清晰,较为简单。

相关标签: 模拟