- 題目描述:
-
有一個網絡日志,記錄了網絡中計算任務的執行情況,每個計算任務對應一條如下形式的日志記錄:
“hs_10000_p”是計算任務的名稱,
“2007-01-17 19:22:53,315”是計算任務開始執行的時間“年-月-日 時:分:秒,毫秒”,
“253.035(s)”是計算任務消耗的時間(以秒計)
hs_10000_p 2007-01-17 19:22:53,315 253.035(s)
請你寫一個程式,對日志中記錄計算任務進行排序。
時間消耗少的計算任務排在前面,時間消耗多的計算任務排在後面。
如果兩個計算任務消耗的時間相同,則将開始執行時間早的計算任務排在前面。
- 輸入:
-
日志中每個記錄是一個字元串,每個字元串占一行。最後一行為空行,表示日志結束。日志中最多可能有10000條記錄。
計算任務名稱的長度不超過10,開始執行時間的格式是YYYY-MM-DD HH:MM:SS,MMM,消耗時間小數點後有三位數字。
計算任務名稱與任務開始時間、消耗時間之間以一個或多個空格隔開,行首和行尾可能有多餘的空格。
- 輸出:
-
排序好的日志記錄。每個記錄的字元串各占一行。
輸入的格式與輸入保持一緻,輸入包括幾個空格,你的輸出中也應該包含同樣多的空格。
- 樣例輸入:
-
hs_10000_p 2007-01-17 19:22:53,315 253.035(s) hs_10001_p 2007-01-17 19:22:53,315 253.846(s) hs_10002_m 2007-01-17 19:22:53,315 129.574(s) hs_10002_p 2007-01-17 19:22:53,315 262.531(s) hs_10003_m 2007-01-17 19:22:53,318 126.622(s) hs_10003_p 2007-01-17 19:22:53,318 136.962(s) hs_10005_m 2007-01-17 19:22:53,318 130.487(s) hs_10005_p 2007-01-17 19:22:53,318 253.035(s) hs_10006_m 2007-01-17 19:22:53,318 248.548(s) hs_10006_p 2007-01-17 19:25:23,367 3146.827(s)
- 樣例輸出:
-
hs_10003_m 2007-01-17 19:22:53,318 126.622(s) hs_10002_m 2007-01-17 19:22:53,315 129.574(s) hs_10005_m 2007-01-17 19:22:53,318 130.487(s) hs_10003_p 2007-01-17 19:22:53,318 136.962(s) hs_10006_m 2007-01-17 19:22:53,318 248.548(s) hs_10000_p 2007-01-17 19:22:53,315 253.035(s) hs_10005_p 2007-01-17 19:22:53,318 253.035(s) hs_10001_p 2007-01-17 19:22:53,315 253.846(s) hs_10002_p 2007-01-17 19:22:53,315 262.531(s) hs_10006_p 2007-01-17 19:25:23,367 3146.827(s)
通過本題知道了,sscanf函數還可以從格式化的字元串中分離出數字。本題主要是就是字元串處理和排序。
C++代碼:
#include <stdio.h>
#include <string.h>
#include<algorithm>
using namespace std;
struct mission
{
char str[200];
char name[20];
int year, month, day, hour, minute, second, micro;
double runtime;
};
bool cmp(mission p, mission q);
int main()
{
//freopen("1.txt","r",stdin);
mission mis[10005];
int i, n = 0;
memset(mis, 0, sizeof(mis));
while(gets(mis[n].str))
{
if(strcmp(mis[n].str, "") == 0)
{
break;
}
sscanf(mis[n].str, "%s%d-%d-%d %d:%d:%d,%d %lf", mis[n].name, &mis[n].year, &mis[n].month, &mis[n].day, &mis[n].hour, &mis[n].minute, &mis[n].second, &mis[n].micro, &mis[n].runtime);
n++;
}
sort(mis,mis+n,cmp);
for(i = 0; i < n; i ++)
{
printf("%s\n", mis[i].str);
}
return 0;
}
bool cmp(mission p, mission q)
{
if(p.runtime !=q.runtime)
return p.runtime<q.runtime;
if(p.year !=q.year)
return p.year<q.year;
if(p.month!=q.month)
return p.month<q.month;
if(p.day!=q.day)
return p.day<q.day;
if(p.hour !=q.hour)
return p.hour<q.hour;
if(p.minute!=q.minute)
return p.minute<q.minute;
if(p.second!=q.second)
return p.second<q.second;
if(p.micro!=q.micro)
return p.micro<q.micro;
return true;
}