1 条题解

  • 0
    @ 2025-3-22 10:04:48

    解决思路
    解析输入:
    将当前时间解析为年、月、日、时、分、秒。
    将营业时间段解析为开始时间和结束时间。
    判断当前时间是否在营业时间段内:
    如果当前时间在营业时间段内,则可以直接输出当前时间。
    如果当前时间不在营业时间段内,则需要计算下一个营业时间。
    处理跨天情况:
    如果营业时间段跨天(如 17:00:00 ~ 07:00:00),则需要判断当前时间是否在跨天的区间内。
    如果不在跨天区间内,则需要等到下一个营业时间。 计算下一个营业时间:
    如果当前时间在营业时间段之前,则下一个营业时间是当天的开始时间。
    如果当前时间在营业时间段之后,则下一个营业时间是第二天的开始时间。
    输出计算出的最早可以吃饭的时间。 parseTime 函数:
    将时间字符串(如 17:00:00)解析为从当天00:00:00 开始的秒数。 formatTime 函数:
    将秒数转换为时间字符串(如 17:00:00)。 isInRange 函数:
    判断当前时间是否在营业时间段内,支持跨天情况。 getNextTime 函数:
    计算下一个营业时间,返回是否需要等到第二天以及具体时间。 主函数:
    解析输入的时间和营业时间段。 调用 getNextTime 计算最早可以吃饭的时间。 输出结果。

    #include <bits/stdc++.h>
    using namespace std;
    
    // 将时间字符串解析为秒数(从当天 00:00:00 开始)
    int parseTime(const string& time) {
        int h = stoi(time.substr(0, 2));
        int m = stoi(time.substr(3, 2));
        int s = stoi(time.substr(6, 2));
        return h * 3600 + m * 60 + s;
    }
    
    // 将秒数转换为时间字符串
    string formatTime(int seconds) {
        int h = seconds / 3600;
        int m = (seconds % 3600) / 60;
        int s = seconds % 60;
        char buffer[10];
        sprintf(buffer, "%02d:%02d:%02d", h, m, s);
        return string(buffer);
    }
    
    // 判断当前时间是否在营业时间段内
    bool isInRange(int current, int start, int end) {
        if (start < end) {
            return current >= start && current < end;
        } else {
            return current >= start || current < end;
        }
    }
    
    // 计算下一个营业时间
    pair<string, int> getNextTime(int current, int start, int end) {
        if (isInRange(current, start, end)) {
            return {"", current}; // 当前时间在营业时间段内
        }
        if (start < end) {
            if (current < start) {
                return {"", start}; // 当天开始时间
            } else {
                return {"next", start}; // 第二天的开始时间
            }
        } else {
            if (current < start && current >= end) {
                return {"", start}; // 当天开始时间
            } else {
                return {"next", start}; // 第二天的开始时间
            }
        }
    }
    
    int main() {
        freopen("04.in","r",stdin);
        freopen("04.out","w",stdout);
        // 输入当前时间
        string date, time;
        cin >> date >> time;
        int year = stoi(date.substr(0, 4));
        int month = stoi(date.substr(5, 2));
        int day = stoi(date.substr(8, 2));
        int current = parseTime(time);
    
        // 输入营业时间段
        string startTimeStr, endTimeStr;
        cin >> startTimeStr >> endTimeStr;
        int start = parseTime(startTimeStr);
        int end = parseTime(endTimeStr);
    
        // 计算下一个营业时间
        auto result = getNextTime(current, start, end);
        string nextDay = result.first;
        int nextTime = result.second;
    
        // 输出结果
        if (nextDay.empty()) {
            // 当天可以吃饭
            cout << date << " " << formatTime(nextTime) << endl;
        } else {
            // 需要等到第二天
            // 计算第二天的日期
            tm tm = {0, 0, 0, day, month - 1, year - 1900}; // tm 结构体表示时间
            tm.tm_mday += 1; // 增加一天
            mktime(&tm); // 标准化时间
            char buffer[11];
            strftime(buffer, sizeof(buffer), "%Y-%m-%d", &tm); // 格式化日期
            cout << buffer << " " << formatTime(nextTime) << endl;
        }
    
        return 0;
    }
    
    • 1

    信息

    ID
    1059
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    9
    已通过
    1
    上传者