百練 2966 時區轉換 解題報告

1.連接:http://poj.grids.cn/practice/2966/ios

2.題目:測試

總時間限制:
1000ms
內存限制:
65536kB
描述
直到19世紀,時間校準是一個純粹的地方現象。每個村莊當太陽升到最高點的時候把他們的時鐘調到中午12點。一個鐘錶製造商人家或者村裏主 表的時間被認爲是官方時間,市民們把自家的鐘表和這個時間對齊。每週一些熱心的市民會帶着時間標準的表,遊走大街小巷爲其餘市民對錶。在城市之間旅遊的 話,在到達新地方的時候須要把懷錶校準。可是,當鐵路投入使用以後,愈來愈多的人頻繁地長距離地往來,時間變得愈來愈重要。在鐵路的早期,時刻表很是讓人 迷惑,每個所謂的停靠時間都是基於停靠地點的當地時間。時間的標準化對於鐵路的高效運營變得很是重要。
在1878年,加拿大人Sir Sanford Fleming 提議使用一個全球的時區(這個建議被採納,並衍生了今天咱們所使用的全球時區的概念),他建議把世界分紅24個時區,每個跨越15度經線(由於地球的經 度360度,劃分紅24塊後,一塊爲15度)。Sir Sanford Fleming的方法解決了一個全球性的時間混亂的問題。
美國鐵路公司 於1883年11月18日使用了Fleming 提議的時間方式。1884年一個國際子午線會議在華盛頓召開,他的目的是選擇一個合適的本初子午線。大會最終選定了格林威治爲標準的0度。儘管時區被肯定 了下來,可是各個國家並無馬上更改他們的時間規範,在美國,儘管到1895年已經有不少州開始使用標準時區時間,國會直到1918年才強制使用會議制定 的時間規範。
今天各個國家使用的是一個Fleming時區規範的一個變種,中國一共跨越了5個時區,可是使用了一個統一的時間規範,比 Coordinated Universal Time(UTC,格林威制時間)早8個小時。俄羅斯也擁護這個時區規範,儘管整個國家使用的時間和標準時區提早了1個小時。澳大利亞使用3個時區,其中 主時區提早於他按Fleming規範的時區半小時。不少中東國家也使用了半時時區(即不是按照Fleming的24個整數時區)。
由於時區是對經度進行劃分,在南極或者北極工做的科學家直接使用了UTC時間,不然南極大陸將被分解成24個時區。
時區的轉化表以下:
UTC Coordinated Universal Time
GMT Greenwich Mean Time, 定義爲 UTC
BST British Summer Time, 定義爲 UTC+1 hour
IST Irish Summer Time, 定義爲 UTC+1 hour
WET Western Europe Time, 定義爲 UTC
WEST Western Europe Summer Time, 定義爲 UTC+1 hour
CET Central Europe Time, 定義爲 UTC+1
CEST Central Europe Summer Time, 定義爲 UTC+2
EET Eastern Europe Time, 定義爲 UTC+2
EEST Eastern Europe Summer Time, 定義爲 UTC+3
MSK Moscow Time, 定義爲 UTC+3
MSD Moscow Summer Time, 定義爲 UTC+4
AST Atlantic Standard Time, 定義爲 UTC-4 hours
ADT Atlantic Daylight Time, 定義爲 UTC-3 hours
NST Newfoundland Standard Time, 定義爲 UTC-3.5 hours
NDT Newfoundland Daylight Time, 定義爲 UTC-2.5 hours
EST Eastern Standard Time, 定義爲 UTC-5 hours
EDT Eastern Daylight Saving Time, 定義爲 UTC-4 hours
CST Central Standard Time, 定義爲 UTC-6 hours
CDT Central Daylight Saving Time, 定義爲 UTC-5 hours
MST Mountain Standard Time, 定義爲 UTC-7 hours
MDT Mountain Daylight Saving Time, 定義爲 UTC-6 hours
PST Pacific Standard Time, 定義爲 UTC-8 hours
PDT Pacific Daylight Saving Time, 定義爲 UTC-7 hours
HST Hawaiian Standard Time, 定義爲 UTC-10 hours
AKST Alaska Standard Time, 定義爲 UTC-9 hours
AKDT Alaska Standard Daylight Saving Time, 定義爲 UTC-8 hours
AEST Australian Eastern Standard Time, 定義爲 UTC+10 hours
AEDT Australian Eastern Daylight Time, 定義爲 UTC+11 hours
ACST Australian Central Standard Time, 定義爲 UTC+9.5 hours
ACDT Australian Central Daylight Time, 定義爲 UTC+10.5 hours
AWST Australian Western Standard Time, 定義爲 UTC+8 hours
下面給出了一些時間,請在不一樣時區之間進行轉化。
輸入
輸入的第一行包含了一個整數N,表示有N組測試數據。接下來N行,每一行包括一個時間和兩個時區的縮寫,它們之間用空格隔開。時間由標準的a.m./p.m給出。midnight表示晚上12點(12:00 a.m.),noon表示中午12點(12:00 p.m.)。
輸出
假設輸入行給出的時間是在第一個時區中的標準時間,要求輸出這個時間在第二個時區中的標準時間。
樣例輸入
4
noon HST CEST 
11:29 a.m. EST GMT
6:01 p.m. CST UTC
12:40 p.m. ADT MSK
樣例輸出
midnight
4:29 p.m.
12:01 a.m.
6:40 p.m.

3.代碼:spa

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 
 6 using namespace std;
 7 
 8 char zone[32][20] = {"UTC","GMT","BST","IST","WET","WEST",
 9                     "CET","CEST","EET","EEST","MSK",
10                     "MSD","AST","ADT","NST","NDT",
11                     "EST","EDT","CST","CDT","MST",
12                     "MDT","PST","PDT","HST","AKST",
13                     "AKDT","AEST","AEDT","ACST","ACDT",
14                     "AWST"};
15 
16 float m_time[32] = {0,0,1,1,0,1,1,2,2,3,3,4,-4,-3,-3.5,-2.5,-5,-4,-6,-5,-7,
17                     -6,-8,-7,-10,-9,-8,10,11,9.5,10.5,8};
18 
19 int main()
20 {
21     int n;
22     cin>>n;
23     getchar();
24     
25     char chs[100];
26     int thour,tminute,minute,diff_minute;
27     float diff_zone;
28     char ch1[20],zone1[20],zone2[20];
29     while(n--)
30     {
31         gets(chs);
32         if(chs[0] == 'n')
33         {
34             sscanf(chs,"%s%s%s",ch1,zone1,zone2);
35             thour = 12;
36             tminute = 0;
37         }
38         else if(chs[0] == 'm')
39         {
40             sscanf(chs,"%s%s%s",ch1,zone1,zone2);
41             thour = 0;
42             tminute = 0;
43         }
44         else
45         {
46             sscanf(chs,"%d:%d %s%s%s",&thour,&tminute,ch1,zone1,zone2);
47             /*if(ch1[0] == 'a')
48             {
49                 if(thour == 12) thour = 0;
50             }
51             else
52             {
53                 if(thour != 12)    thour += 12;
54             }*/
55             thour %= 12;
56             if(ch1[0] == 'p') thour += 12;
57         }
58         
59         minute = thour * 60 + tminute;
60         
61         int m_idx1,m_idx2;
62         for(int i = 0; i < 32; i++)
63         {
64             if(!strcmp(zone[i],zone1)) m_idx1 = i;
65             if(!strcmp(zone[i],zone2)) m_idx2 = i;
66         }
67         diff_zone = m_time[m_idx2] - m_time[m_idx1];
68         minute += (int)(diff_zone * 60);
69         
70         if(minute < 0) minute += 1440;
71         minute %= 1440;
72         
73         thour = minute / 60;
74         tminute = minute % 60;
75         
76         if(thour == 0 && tminute == 0) printf("midnight\n");
77         else if(thour == 0) printf("12:%02d a.m.\n",tminute);
78         else if(thour < 12) printf("%d:%02d a.m.\n",thour,tminute);
79         else if(thour == 12 && tminute == 0) printf("noon\n");
80         else if(thour == 12) printf("12:%02d p.m.\n",tminute);
81         else printf("%d:%02d p.m.\n",thour-12,tminute);
82     }
83     
84     return 0;
85 }

4.思路:code

(1)一個不當心,錯了N屢次blog

(2)此題目注意時間的表示,好比 12:01 a.m. 指的是凌晨0點01分,注意!這種還有不少要一一注意內存

(3)能夠先轉成分鐘,而後再計算能夠免除不少的麻煩ci

相關文章
相關標籤/搜索