[UVA10281] Average Speed

Posted by John on 2016-02-19
Words 491 and Reading Time 2 Minutes
Viewed Times

You have bought a car in order to drive from Waterloo to a big city. The odometer on their car is broken, so you cannot measure distance. But the speedometer and cruise control both work, so the car can maintain a constant speed which can be adjusted from time to time in response to speed limits, traffic jams, and border queues. You have a stopwatch and note the elapsed time every time the speed changes. From time to time you wonder, “how far have I come?”.

To solve this problem you must write a program to run on your laptop computer in the passenger seat.


Standard input contains several lines of input: Each speed change is indicated by a line specifying the elapsed time since the beginning of the trip (hh:mm:ss), followed by the new speed in km/h. Each query is indicated by a line containing the elapsed time. At the outset of the trip the car is stationary. Elapsed times are given in non-decreasing order and there is at most one speed change at any given time.


For each query in standard input, you should print a line giving the time and the distance travelled, in the format below.

Sample Input

00:00:01 100
01:00:01 50
03:00:05 140

Sample Output

00:15:01 25.00 km
00:30:01 50.00 km
03:00:01 200.00 km

題意: 給你某個時間的速度,沒有給則代表沒改變,要你求總共走的距離。

想法: 簡單的求距離,容易卡在精確度的問題以及I/O上,因為不定長度所以用字串存取再去分割 ,上網查了之後發現sscanf的回傳值代表正確的讀取數,而讀取失敗的則不會有影響(Ex:sscanf去分割4個變數,但在只有輸入三個變數的情形下並不會出錯,第4個變數值不會更動,而回傳值是3(假設型態皆正確)),於是利用sscanf來寫即可。

#include <stdio.h> 
#include <stdlib.h>
int main() {
char str[200];
int h,m,s,t,t1 = 0,c;
double ans = 0,v = 0,v1 = 0;
while(gets(str)) {
c = sscanf(str,"%d:%d:%d %lf",&h,&m,&s,&v1);
t = h * 3600 + m * 60 + s;
//printf("*%f\n",div * v1/3600.0);
ans += (t - t1) * v/3600.0; t1 = t;
if(c == 3) printf("%.2d:%.2d:%.2d %.2lf km\n",h,m,s,ans);
else v = v1;
return 0;