UVa10281 - Back to High School Physics (實作題)

題目大意

有台汽車的里程數壞掉了,於是我們手動拿上碼表 + 定速開車,想詢問每次我們標記的時間時已經行駛了多少公里。

分析

毒,到處都是毒。這題是大毒阿,快逃RRRR

很簡單的操作題,先將所有的時間換成秒數,之後再乘以速度,但這裡的速度是 km/hr,因此要在除以 3600 就是答案。

重點觀念

  • 這題如果要使用 cin,會非常難寫,建議使用 scanf
    因為你沒辦法知道他到底這次有沒有要加速或是詢問你當前的距離
  • 如果習慣 #define int long long 記住使用 scanf 要搭配 %lld
  • windows 情況下,double 有機率無法被 scanf 用到,毒,這是毒阿。
    scanf GCC for long double [duplicate]
  • 有可能他連續加速兩次,因此計算里程數時不可以等到要查詢碼表時間是在算,必須每次都要算,
    1
    2
    3
    //舉例
    00:00:01 12
    00:00:03 24
  • 任何一個計算公式都不可以有 int 與 float 運算出現,不然會高機率出錯。因此建議不用

參考來源

齊笎編寫的 hackmd 詳解

心得

這題滿滿的都是坑阿…,我最不擅長寫關於小數點的題目了,希望以後遇到小數點的題目都可以安然度過。這次的 scanf 不能輸入 double 我花了 2 小時去想真的是太難過了…,不過齊笎介紹使用的 sscanf 到蠻好用的,值的紀錄。

可以用 sscanf 加一個 string 格式化輸入資料,還可以知道有多少筆資料被成功輸入,真的好用、真的香,讚啦

題目程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <bits/stdc++.h>
#define LOCAL
#define int long long
using namespace std;

int h , m , s , data ;
float new_speed , speed=0 , mile=0 ,s1=0 ,s2=0 ; //s1 begin time , s2 end time
char strQ[128] ;


int32_t main()
{
#ifdef LOCAL
freopen("in1.txt" , "r" , stdin );
freopen("out.txt" , "w" , stdout);
#endif // LOCAL
while(gets(strQ)){
//printf("%s\n" , strQ);
data = sscanf(strQ , "%lld:%lld:%lld %f" , &h , &m , &s , &new_speed);
//printf("%lld:%lld:%lld %f\n",h , m , s , new_speed);
s2 = s1 ;
s1 = h * 3600 + m * 60 + s ;
mile += abs(s1-s2) * speed / 3600 ;
if(data == 4){
speed =new_speed ;
}
if(data == 3){
//printf("speed is %f\n" , speed);

printf("%.2lld:%.2lld:%.2lld %.2f km\n" , h , m ,s ,mile);
}
}

return 0;
}
  • 版權聲明: 本部落格所有文章除有特別聲明外,均採用 Apache License 2.0 許可協議。轉載請註明出處!
  • © 2020-2024 John Doe
  • Powered by Hexo Theme Ayer
  • PV: UV: