天天看點

題目1130:日志排序

題目描述:

有一個網絡日志,記錄了網絡中計算任務的執行情況,每個計算任務對應一條如下形式的日志記錄:

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

繼續閱讀