藍橋杯-航班時間(簡單寫法+sscanf的應用)

小程xy發表於2024-05-15

小 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;
}

覺得寫得不錯的話, 點個贊吧~