1 条题解
-
0
题意分析
本题要求我们实现一个时区转换系统,能够根据给定的时间和起始时区,计算出目标时区的对应时间。主要考察以下几个方面的能力:
- 时间格式处理:需要解析多种时间表示形式( 、 、"noon"、"midnight")
- 时区转换规则:需要将各个时区缩写转换为与的固定偏移量(如、)
- 时间计算:需要正确处理跨日计算(如 小时=)和上下午转换
- 输出格式:需要将计算结果转换为要求的输出格式
解题思路
1. 建立时区偏移量字典
首先需要建立一个字典,将每个时区缩写映射到其相对于的小时偏移量(包括半小时时区如)。
2. 时间标准化处理
将各种输入时间转换为统一的小时制分钟数表示:
- 处理特殊词:"noon" → (分钟),"midnight" → (分钟)
- 解析常规时间:
- → 当时视为点,否则保持
- → 当时加小时
3. 时区转换计算
- 计算起始时区和目标时区相对于的偏移量差:$\Delta = (target\_offset - source\_offset) \times 60$(转换为分钟)
- 将原始时间加上时区差,并对分钟(小时)取模处理循环
4. 结果格式化输出
将计算后的分钟数转换回要求的输出格式:
- 分钟 → "midnight"
- 分钟 → "noon"
- 其他时间转换为小时制格式
代码实现
#include <iostream> #include <string> #include <map> #include <cstdlib> #include <cstdio> #include <iomanip> using namespace std; // 定义时区及其UTC偏移量(小时) map<string, double> time_zones; void init_time_zones() { time_zones["UTC"] = 0; time_zones["GMT"] = 0; time_zones["BST"] = 1; time_zones["IST"] = 1; time_zones["WET"] = 0; time_zones["WEST"] = 1; time_zones["CET"] = 1; time_zones["CEST"] = 2; time_zones["EET"] = 2; time_zones["EEST"] = 3; time_zones["MSK"] = 3; time_zones["MSD"] = 4; time_zones["AST"] = -4; time_zones["ADT"] = -3; time_zones["NST"] = -3.5; time_zones["NDT"] = -2.5; time_zones["EST"] = -5; time_zones["EDT"] = -4; time_zones["CST"] = -6; time_zones["CDT"] = -5; time_zones["MST"] = -7; time_zones["MDT"] = -6; time_zones["PST"] = -8; time_zones["PDT"] = -7; time_zones["HST"] = -10; time_zones["AKST"] = -9; time_zones["AKDT"] = -8; time_zones["AEST"] = 10; time_zones["AEDT"] = 11; time_zones["ACST"] = 9.5; time_zones["ACDT"] = 10.5; time_zones["AWST"] = 8; } // 将时间转换为分钟数(0-1440) int time_to_minutes(const string& time_str) { if (time_str == "noon") return 12 * 60; if (time_str == "midnight") return 0; int hour, minute; char period[5]; sscanf(time_str.c_str(), "%d:%d %s", &hour, &minute, period); if (hour == 12) hour = 0; if (string(period) == "p.m.") hour += 12; return hour * 60 + minute; } // 将分钟数转换为时间字符串 string minutes_to_time(int minutes) { minutes = (minutes + 1440) % 1440; // 处理负数 if (minutes == 0) return "midnight"; if (minutes == 12 * 60) return "noon"; int hour = minutes / 60; int minute = minutes % 60; string period; if (hour == 0) { hour = 12; period = "a.m."; } else if (hour < 12) { period = "a.m."; } else if (hour == 12) { period = "p.m."; } else { hour -= 12; period = "p.m."; } char buf[20]; sprintf(buf, "%d:%02d %s", hour, minute, period.c_str()); return string(buf); } int main() { init_time_zones(); int N; cin >> N; cin.ignore(); // 忽略换行符 while (N--) { string line; getline(cin, line); size_t first_space = line.find(' '); size_t last_space = line.rfind(' '); string time_str = line.substr(0, first_space); string from_zone = line.substr(first_space + 1, last_space - first_space - 1); string to_zone = line.substr(last_space + 1); // 转换为UTC分钟数 int minutes = time_to_minutes(time_str); double from_offset = time_zones[from_zone]; double to_offset = time_zones[to_zone]; // 计算时间差(分钟) double diff = (to_offset - from_offset) * 60; int total_minutes = minutes + static_cast<int>(diff + 0.5); // 四舍五入 // 转换回时间字符串 string result = minutes_to_time(total_minutes); cout << result << endl; } return 0; }
- 1
信息
- ID
- 1352
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 1
- 上传者