九度oj 题目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)

 1 #include <cstdio>
 2 #include <string>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define MAX 302
 6  
 7 char toDo[10002][MAX];
 8  
 9 struct Task
10 {
11   char name[12];
12   char day[12];
13   char times[20];
14   double cost;
15   int id;
16 };
17 Task task[10002];
18  
19 int cmp(const void *a, const void *b) {
20     Task at = *(Task*)a;
21     Task bt = *(Task*)b;
22     if(at.cost == bt.cost) {
23       int tmpa = strcmp(at.day,bt.day);
24         if(tmpa == 0) {
25           int tmpb = strcmp(at.times, bt.times);
26           if(tmpb == 0) {
27               return at.id - bt.id;
28           }
29           else {
30               return tmpb;
31           }
32         }
33         else {
34           return tmpa;
35         }
36     }
37     else {
38        if(at.cost > bt.cost) {
39             return 1;
40        }
41        else {
42             return -1;
43        }
44     }
45      
46 }
47  
48  
49 int main(int argc, char const *argv[])
50 {
51     //freopen("input.txt","r",stdin);
52     int k = 0;
53     while(gets(toDo[k]) != 0) {
54         sscanf(toDo[k], "%s %s %s %lf",task[k].name,task[k].day,task[k].times,&task[k].cost);
55         task[k].id = k;
56         k++;
57     }
58     qsort(task, k, sizeof(Task), cmp);
59     for(int i = 0; i < k; i++) {
60       puts(toDo[task[i].id]);
61     }
62     return 0;
63 }

注意如果直接return a - b; 如果 a - b = 0.01,转化为int 就成为0了

posted @ 2016-08-05 11:31  Jason杰  阅读(511)  评论(0编辑  收藏  举报