1. 程式人生 > >1999:日誌排序(4.1演算法之排序和演算法效能)

1999:日誌排序(4.1演算法之排序和演算法效能)

1999:日誌排序

總時間限制: 1000ms 記憶體限制: 65536kB
描述
有一個網路日誌,記錄了網路中計算任務的執行情況,每個計算任務對應一條如下形式的日誌記錄:“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)

#include <iostream>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
//http://noi.openjudge.cn/ch0401/1999/
//我也是沒想到一行竟然會多於100個字元,所以開始陣列又開小了些
//掌握了sscanf的用法,灰常有用!! 
struct data{
    char name[12],day[20],time[20];
    double sp;
    int num;
};
char set[10002][400],tmp;
data re[10002
]; int n=0; bool cmp(data x,data y){ if(x.sp!=y.sp)return x.sp<y.sp; for(int i=0;i<strlen(x.day);i++){ if(x.day[i]!=y.day[i])return x.day[i]<y.day[i]; } for(int i=0;i<strlen(x.time);i++){ if(x.time[i]!=y.time[i])return x.time[i]<y.time[i]; } } int main(int
argc, char *argv[]) { while((tmp=cin.get())!='\n'){ cin.putback(tmp); cin.getline(set[n],100); //把資料格式化的放入re中 sscanf(set[n],"%s %s %s %lf",re[n].name, re[n].day,re[n].time,&re[n].sp); re[n].num=n; n++; } sort(re,re+n,cmp); for(int i=0;i<n;i++){ cout<<set[re[i].num]<<endl; } return 0; }