HDU - 6556

The World

前段时间,tyd和zx环游了世界,他们玩的非常开心,并且发现了很多好玩的事情。
世界各地都有不同的时区,导致时差。 在这里,你可以了解几个著名的首都及其相应的时区。

北京Beijing - 中国 - UTC + 8(中国标准时间)

华盛顿Washington - 美国 - UTC - 5(东部标准时间)

伦敦London - 英国 - UTC(格林威治标准时间)

莫斯科Moscow - 俄罗斯 - UTC + 3(莫斯科时间)

根据城市的当地时间,您需要计算上述首都中另一个特定城市的日期和当地时间。
Input
第一行输入包含一个整数 T,T ≤ 1000 表示测试用例的数量.
每个测试用例包含三行. 第一行的形式为 “hour:minute AM/PM” (1 ≤ hour ≤ 12, 00 ≤ minute ≤ 59) 表示当地时间. 接下来的两行包含两个字符串 s1,s2. s1 是与给定时间对应的城市名称, 而s2表示希望你计算当地时间的城市。.
Output
对于每个测试用例, 以 “Case i:”开头, 其中i表示样例编号, 然后按照以下格式输出单行“Yesterday/Today/Tomorrow hour:minute AM/PM”, 用空格分隔. 第一个单词描述了相应的日期.
Sample Input
2
12:00 AM
London
Moscow
4:00 PM
London
Beijing
Sample Output
Case 1: Today 3:00 AM
Case 2: Tomorrow 12:00 AM
传送门

思路,将读入时间转换成[0,24)的整数
(注意题目中12:00 AM是今天0:00,12:00 PM是中午12:00,见样例二,只有0-23是属于今天的,24属于明天)
特判一下这两个时间就可以了
#include<iostream>
#include<string>
#include<stdio.h>
#include<map>

using namespace std;
int main()
{
	int T;
	map<string,int>mp;
	mp["Beijing"]=8,mp["Washington"]=-5,mp["London"]=0,mp["Moscow"]=3;
	cin>>T;
	for(int tt=1;tt<=T;tt++)
	{
		string time,st,s1,s2;
		cin>>time>>st>>s1>>s2;	
		printf("Case %d: ",tt);
		int hour,minnue;
		if(time.size()==5) {
			hour=(time[0]-'0')*10+time[1]-'0';minnue=(time[3]-'0')*10+time[4]-'0';
		}
		else hour=time[0]-'0',minnue=(time[2]-'0')*10+time[3]-'0';
		
		if(hour==12&&st=="AM") hour=0;
		else if(st=="PM"&&hour!=12) hour+=12;
		hour-=mp[s1];
		hour+=mp[s2];
		
		string day;
		if(hour>=0&&hour<24){
			day="Today ";
			if(hour<12) {
				st="AM";
				if(hour==0) hour=12;
			}
			else {
				st="PM";
				if(hour!=12) hour-=12;
			}
		}
			
		else if(hour<0) {
			day="Yesterday ";
			hour+=24;
			if(hour<12) {
				st="AM";
				if(hour==0) hour=12;
			}
			else {
				st="PM";
				if(hour!=12) hour-=12;
			}
					
		}
		else {
			hour-=24;
			day="Tomorrow ";
			if(hour<12) {
				st="AM";
				if(hour==0) hour=12;
			}
			else {
				st="PM";
				if(hour!=12) hour-=12;
			}		

		}
		
		string time1;
		time1+=minnue/10+'0';
		time1+=minnue%10+'0';
		cout<<day<<hour<<':'<<time1<<" "<<st<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值