1 条题解
-
0
解决思路
解析输入:
将当前时间解析为年、月、日、时、分、秒。
将营业时间段解析为开始时间和结束时间。
判断当前时间是否在营业时间段内:
如果当前时间在营业时间段内,则可以直接输出当前时间。
如果当前时间不在营业时间段内,则需要计算下一个营业时间。
处理跨天情况:
如果营业时间段跨天(如 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
- 上传者