题目链接: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;
}