【算法练习】字符串处理 poj2998:日志排序

题目链接:http://bailian.openjudge.cn/practice/2998

2998:日志排序

总时间限制: 

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)

题目理解:排序的cmp函数,

主要需要处理的是输入的格式,输入可以带空格的行,最后又要按照原样输出,而且还要提取原来字符串中的一些信息,所以就要用到sscanf这个函数。【注意一个要加&】

最后结束输入是空行

用到

while(tmp=cin.get()!='\n'){

    cin.putback(tmp); 

    cin.getline(str,300);

    ...

}

或者用getline输入的字符串的第一个判断是否是\0

https://blog.csdn.net/wjl_zyl_1314/article/details/83691869

比较函数一开始写的WA;AC如下,应该是不能return一个整数这样的

bool cmp(R a,R b){
    if(a.time!=b.time) {
        return a.time < b.time;
    }
    else if(strcmp(a.syear,b.syear)!=0){
         //如果a<b应该return true
        return  strcmp(a.syear,b.syear)<0;
    }
    else{
        return  strcmp(a.stime,b.stime)<0;
    }
}

AC代码

#include<stdio.h>
#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>

using namespace std;

struct R{
    char name[50];
    char syear[20];
    char stime[20];
    double time;
    char origin[500];
}record[10010];

char str[300];
bool cmp(R a,R b){
    if(a.time!=b.time) {
        return a.time < b.time;
    }
    else if(strcmp(a.syear,b.syear)!=0){
         //如果a<b应该return true
        return  strcmp(a.syear,b.syear)<0;
    }
    else{
        return  strcmp(a.stime,b.stime)<0;
    }
}
int main(){
    int n=0;
    char tmp;
    while(cin.getline(str,300))  //不知道这样可不可  输入以空行结束这样可以吗
    {
        if(str[0]=='\0') break;
        /*tmp=cin.get()!='\n'
        cin.putback(tmp);
        cin.getline(str,300);*/
        sscanf(str,"%s%s%s%lf",record[n].name,record[n].syear,record[n].stime,&record[n].time);  //注意double要加&
        strcpy(record[n].origin,str);
        n++;
    }
    sort(record,record+n,cmp);
    for(int i=0;i<n;i++){
        printf("%s\n",record[i].origin);
    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40760678/article/details/100056675