1 条题解

  • 0

    题意分析

    本题要求我们实现一个时区转换系统,能够根据给定的时间和起始时区,计算出目标时区的对应时间。主要考察以下几个方面的能力:

    1. 时间格式处理:需要解析多种时间表示形式(12:3012:30 p.m.p.m.5:005:00 a.m.a.m.、"noon"、"midnight")
    2. 时区转换规则:需要将各个时区缩写转换为与UTCUTC的固定偏移量(如EST=UTC5EST=UTC-5CEST=UTC+2CEST=UTC+2
    3. 时间计算:需要正确处理跨日计算(如23:0023:00 ++ 33小时=02:0002:00)和上下午转换
    4. 输出格式:需要将计算结果转换为要求的输出格式

    解题思路

    1. 建立时区偏移量字典

    首先需要建立一个字典,将每个时区缩写映射到其相对于UTCUTC的小时偏移量(包括半小时时区如NST=3.5NST=-3.5)。

    2. 时间标准化处理

    将各种输入时间转换为统一的2424小时制分钟数表示:

    • 处理特殊词:"noon" → 12:0012:00720720分钟),"midnight" → 00:0000:0000分钟)
    • 解析常规时间:
      • hh:mmhh:mm a.m.a.m. → 当hh=12hh=12时视为00点,否则保持hhhh
      • hh:mmhh:mm p.m.p.m. → 当hh12hh≠12时加1212小时

    3. 时区转换计算

    1. 计算起始时区和目标时区相对于UTCUTC的偏移量差:$\Delta = (target\_offset - source\_offset) \times 60$(转换为分钟)
    2. 将原始时间加上时区差,并对14401440分钟(2424小时)取模处理循环

    4. 结果格式化输出

    将计算后的分钟数转换回要求的输出格式:

    • 00分钟 → "midnight"
    • 720720分钟 → "noon"
    • 其他时间转换为1212小时制a.m./p.m.a.m./p.m.格式

    代码实现

    #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
    上传者