题解 | #开门人和关门人#
开门人和关门人
https://www.nowcoder.com/practice/a4b37b53a44d454ab0834e1517983215
#include <cstdlib> #include <iostream> #include <queue> #include <vector> using namespace std; #include <map> #include "queue" #include "cstring" typedef pair<string,string> PII; priority_queue<PII,vector<PII>,greater<PII>> open; //小根堆找最早签到 priority_queue<PII> close; // 大根堆 找 最晚签到的人 int n; int main() { cin >> n; while(n--){ string id,optime,cltime; cin >> id >> optime >> cltime; optime.erase(2,1); optime.erase(4,1); cltime.erase(2,1); cltime.erase(4,1); open.push(PII{optime,id}); close.push(PII{cltime,id}); } string ido=open.top().second; string clo=close.top().second; cout << ido <<' '<<clo <<endl ; } // 64 位输出请用 printf("%lld")
一开始 没好好看题 , 以为中间 没人 的时候 也要关门 想了半天
再一看 原来 是 每天第一个到开门 , 最后一个才关门 不用管 中间情况
那就直接用两个 堆存 开门时间和 关门时间就可以了 一个小根堆 一个大根堆
注 : 堆默认 排序 字符串 的字典序 排
所以时间 就按字符串存 就可以 ,其实 erase 这两句也不用写