题目链接
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; } }