题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=6556

题目大意

题目给了三个地方,后面的数表示与标准时间的差值。
你要输入一个时间,俩地点,代表第一个地点的时间,求第二个地点此时的时间。

解题思路

直接懵了,因为我对12小时的闹钟真的是一直没搞明白过,有时候想定中午12点的闹钟,直接定成了凌晨,最后起晚了。
所以,我们先说一下12小时的时钟,
12:00 AM 对应我们所谓的半夜零点;
1:00 AM 对应凌晨1点;
2:00 AM 对应凌晨2点;
3:00 AM 对应凌晨3点
……
11:00 AM 对应上午11点
12:00 PM 对应中午12点(巨奇怪)
1:00 PM 对应下午1点
2:00 PM 对应下午2点
……
11:00 PM 对应晚上11点
再加一小时就变成了12:00 AM,也就是半夜零点
还有一点要注意,比如现在是 11:00 PM再过一小时,变成 12:00 AM,同时也变成了新的一天,比如 11:00 PM还是10月13号,到了12:00 AM就变成10月14号了。

AC代码

#include<bits/stdc++.h>
#define sc(x) scanf("%d",&x)
#define ll long long
using namespace std;
int n;
map<string,int> mp;
int main(){
    mp["Beijing"]=8;mp["Washington"]=-5;mp["London"]=0;mp["Moscow"]=3;
    sc(n);
    for(int i=1;i<=n;i++){
        int hour,minute;
        string AP,pos1,pos2,date="Today";//AP存AM or PM;pos存两个地方的名字,date存今明昨

        sc(hour);getchar();sc(minute);getchar();cin>>AP;//自我感觉输入挺巧妙的,从大佬代码中学到的
        cin>>pos1>>pos2;
        int woc=mp[pos2]-mp[pos1];

        if(hour==12) hour=0;//12当0算,方便;最后记得转换回来
        hour+=woc;

        if(hour>=12){
            while(hour>=12){
                if(AP=="AM") AP="PM";
                else AP="AM",date="Tomorrow";
                hour-=12;
            }
            if(hour==0) hour=12;
        }
        else if(hour<=0){
            while(hour<0){
                if(AP=="AM") AP="PM",date="Yesterday";
                else AP="AM";
                hour+=12;    
            }
            if(hour==0) hour=12;
        }

        cout<<"Case "<<i<<": "<<date<<' '<<hour<<':';
        printf("%02d ",minute);
        cout<<AP<<endl;
    }
}