小 h 前往美國參加了藍橋杯國際賽。
小 h 的女朋友發現小 h 上午十點出發,上午十二點到達美國,於是感嘆到“現在飛機飛得真快,兩小時就能到美國了”。
小 h 對超音速飛行感到十分恐懼。
仔細觀察後發現飛機的起降時間都是當地時間。
由於北京和美國東部有 12 小時時差,故飛機總共需要 14 小時的飛行時間。
不久後小 h 的女朋友去中東交換。
小 h 並不知道中東與北京的時差。
但是小 h 得到了女朋友來回航班的起降時間。
小 h 想知道女朋友的航班飛行時間是多少。
對於一個可能跨時區的航班,給定來回程的起降時間。
假設飛機來回飛行時間相同,求飛機的飛行時間。
輸入格式
一個輸入包含多組資料。
輸入第一行為一個正整數 T,表示輸入資料組數。
每組資料包含兩行,第一行為去程的起降時間,第二行為回程的起降時間。
起降時間的格式如下:
h1:m1:s1 h2:m2:s2
h1:m1:s1 h3:m3:s3 (+1)
h1:m1:s1 h4:m4:s4 (+2)
第一種格式表示該航班在當地時間h1時m1分s1秒起飛,在當地時間當日h2時m2分s2秒降落。
第二種格式表示該航班在當地時間h1時m1分s1秒起飛,在當地時間次日h2時m2分s2秒降落。
第三種格式表示該航班在當地時間h1時m1分s1秒起飛,在當地時間第三日h2時m2分s2秒降落。
輸出格式
對於每一組資料輸出一行一個時間hh:mm:ss,表示飛行時間為hh小時mm分ss秒。
注意,當時間為一位數時,要補齊前導零,如三小時四分五秒應寫為03:04:05。
資料範圍
保證輸入時間合法(0≤h≤23,0≤m,s≤59),飛行時間不超過24小時。
輸入樣例:
3
17:48:19 21:57:24
11:05:18 15:14:23
17:21:07 00:31:46 (+1)
23:02:41 16:13:20 (+1)
10:19:19 20:41:24
22:19:04 16:41:09 (+1)
輸出樣例:
04:09:05
12:10:39
14:22:05
題解:
- 把讀入的時間都轉換成秒
- 把往返兩次 最終的秒數減去開始的秒數相加 再除2就是答案
- 最後把飛行的秒數轉換成小時、分鐘、秒, 格式化輸出
sscanf的介紹 (注意第一個引數是 C語言的字串)
int sscanf (const char * s, const char * 格式, ...);
從字串中讀取格式化資料
從 s 讀取資料並根據引數格式將它們儲存到附加引數指定的位置,就像使用scanf一樣,但sscanf是從s讀取而不是標準輸入 ( stdin )。
ac程式碼👇
#include <bits/stdc++.h>
using namespace std;
int get_time()
{
string line;
getline(cin, line);
if (line.back() != ')') line += " (0)"; // 方便後面統一處理字串
int h1, m1, s1, h2, m2, s2, d;
sscanf(line.c_str(), "%d:%d:%d %d:%d:%d (%d)", &h1, &m1, &s1, &h2, &m2, &s2, &d);
// 👇相隔天數乘 1天的秒數
return (h2 * 3600 + m2 * 60 + s2 + d * 3600 * 24) - (h1 * 3600 + m1 * 60 + s1);
}
int main()
{
int T; cin >> T;
cin.ignore();
while (T --)
{
int time = (get_time() + get_time()) / 2;
int h = time / 3600, m = time % 3600 / 60, s = time % 60;
printf ("%02d:%02d:%02d\n", h, m, s);
}
return 0;
}
覺得寫得不錯的話, 點個贊吧~