首页 > 其他分享 >DreamJudge-1227-日志排序(精华)

DreamJudge-1227-日志排序(精华)

时间:2024-06-14 23:24:03浏览次数:12  
标签:1227 01 22 17 19 hs DreamJudge 2007 日志

1.题目介绍

Time Limit: 1000 ms
Memory Limit: 256 mb

有一个网络日志,记录了网络中计算任务的执行情况,每个计算任务对应一条如下形式的日志记录: “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)

题目来源
北京大学机考题

2.题解

2.1 字符串处理(istringstream) 和 sort排序

思路

据我观察,这里有很多题解的完成率其实只有75%,这是为什么呢?因为他们都是将整个开始时间读作一个字符串,运行时间读作一个字符串,然后进行比较
这里有一个很坑的点,毫秒数和运行时间并不是字节序越小一定时间越早/短, 虽然前面的年月日时分秒由于格式固定这么说是没有错的;
但是对于毫秒数和运行时间,由于位数并不确定,像是字节序"40" > "355", 但是实际数值上上 40 < 355,这就会导致结果的错误
我这里采用了类 + sort排序, 进行了一个三层排序; 这里类中存一个整字符串,是因为拆了又合并,有两个东西位数不确定,不好确定如何拼接,干脆多存一个,直接输出了
这里字符串处理核心采用了 istringstream流,对于避开空格符和知道终止符的情况,是非常的好用,大家也可以了解一下

代码

#include <bits/stdc++.h>

using namespace std;

class Log {
public:
    string content;
    string name;
    string startDate;
    double ms;
    double runtime;

    Log(string content, string name, string date,  double ms, double runtime) 
        : content(content), name(name), startDate(date), ms(ms), runtime(runtime) {}

    // 比较函数
    bool operator<(const Log& other) const {
        if (runtime != other.runtime) {
            return runtime < other.runtime;
        } else if (startDate != other.startDate) {
            return startDate < other.startDate;
        } 
        return ms < other.ms;
    }
};

int main() {
    vector<Log> logs;
    string input;

    while (getline(cin, input) && !input.empty()) {
        string name, spare, datetime, runtimeStr;
        double ms, runtime;
        istringstream iss(input);
		// 读入程序名 
        iss >> name;
        // 这里读入起始时间(不包括ms) 
        // 第一个参数:iss >> std::ws 跳跃空格; 第二个参数:读入后存储的参数; 第三个参数为读入终止符 ; 
        getline(iss >> std::ws, datetime, ',');
        // ms需要单独处理, 像是 '40' > '355' 但是 40 < 355, 下面的运行时间同理 
        iss >> ms;
        getline(iss >> std::ws, runtimeStr, '(');
        runtime = stod(runtimeStr); // 转换为double类型 
        logs.emplace_back(input, name, datetime, ms, runtime);
    }

    // 使用 stable_sort 进行稳定排序, 默认采用Log的 < 运算比较符 
    stable_sort(logs.begin(), logs.end());

    // 输出所有日志条目
    for (const auto& log : logs) {
        cout << log.content << endl;
    }

    return 0;
}

标签:1227,01,22,17,19,hs,DreamJudge,2007,日志
From: https://www.cnblogs.com/trmbh12/p/18248820

相关文章

  • DreamJudge-1217-国名排序
    1.题目描述TimeLimit:1000msMemoryLimit:256mb问题描述:小李在准备明天的广交会,明天有来自世界各国的客房跟他们谈生意,小李要尽快的整理出名单给经理,你能帮他把客户来自的国家按英文字典次序排好吗?例如小李手上有来自加拿大,美国,中国的名单,排好的名单应是美国,加拿......
  • DreamJudge-1159-成绩排序2.0
    1.题目描述TimeLimit:1000msMemoryLimit:32768mb用一维数组存储学号和成绩,然后,按成绩排序输出。输入输出格式输入描述:输入第一行包括一个整数N(1<=N<=100),代表学生的个数。接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。输出描述:按照学生的成......
  • 学习日志-C51-串口通信
    学习日志-C51-串口通信串口控制LED灯亮灭1.常见通信串口比较分类1:单工:只能由甲向乙传输信号,一根传输线。半双工:数据可以在双方传输,但同一时刻只能单方传输,发送数据的同时不能接收数据,一根传输线。全双工:数据可以在双方传输,发送数据的同时也能接收数据,需两根传输线。......
  • Day26.查看购物车、记录日志
    1.查看购物车、记录日志_查看购物车功能用户视图层(src.py)和购物商城接口(shop_interface.py) 查看购物车功能用户视图层(src.py)#9.查看购物车@common.login_authdefcheck_shop_car():#直接调用查看购物车接口check_shop_car=shop_interface.check_shop_ca......
  • C#如何查看/写入日志到Windows事件查看器
    Windows事件日志Windows操作系统将与计算机的系统性能、应用程序和安全方面相关的每个事件记录在C:\WINDOWS\system32\winevt的日志中。事件查看器从这些原始事件日志中读取信息,然后以可读格式呈现信息。打开Windows事件查看器的方法是1、运行输入eventvwr2、Windows+X打......
  • python系列:python fastapi + uvicorn 记录日志的最佳实践,结合nb_log
    pythonfastapi+uvicorn记录日志的最佳实践,结合nb_logpythonfastapi+uvicorn记录日志的最佳实践,结合nb_logpythonfastapi+uvicorn记录日志的最佳实践,结合nb_logpythonfastapi+uvicorn记录日志的最佳实践,要记录对fastapi什么时候请求了什么url和入......
  • DophinScheduler 如何定期删除日志实例?
    转载自东华果汁哥ApacheDophinScheduler运行一段时间后,实例调度日志越来越多,需要定期清理。SQL错误[1701][42000]:Cannottruncateatablereferencedinaforeignkeyconstraint(`dolphinscheduler`.`t_ds_task_instance`,CONSTRAINT`foreign_key_instance_id`)......
  • 服务日志审计项目
    服务日志审计项目目的要求:实施后可以让运维和开发的所有执行的命令都有记录可查,杜绝内部人员操作隐患)(缺陷:单机、本地服务器上应用配置sudo命令日志审计,并不记录普通用户的普通操作,而是记录,那些执行sudo命令的用户的操作。sudo配合syslog服务,进行日志审计。安装sudo命令和sy......
  • DreamJudge-1240-首字母大写
    1.题目介绍TimeLimit:1000msMemoryLimit:256mb对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。在字符串中,单词之间通过空白符分隔,空白符包括:空格('')、制表符('\t')、回车符('\r')、换行符('\n')。输入输出格式输入描述:输......
  • 开源高性能结构化日志模块NanoLog
      最近在写数据库程序,需要一个高性能的结构化日志记录组件,简单研究了一下Microsoft.Extensions.Logging和Serilog,还是决定重造一个轮子。一、使用方法  直接参考以下示例代码:NanoLogger.Start();DateTime?nullable=null;constboolboolValue=true;constcharch......