卡时间
再者题目中强调请求时间有序
所以把记录按时间排好序,然后按序访问,这样只要访问一遍就可以得到所有的结果
代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
struct recode{
string pname;
//int hh, mm, ss;
int t;
bool in;//为in即为true,out为false
};
int n, k;
vector<recode> all_recodes,right_recodes;
map<string,int> mp;
int changetime(int hh, int mm, int ss){
return hh*3600+mm*60+ss;
}
bool comparetime(recode a, recode b){
if(a.t < b.t) return true;
else return false;
}
bool compare(recode a, recode b){
if(a.pname < b.pname) return true;
else if(a.pname == b.pname && a.t < b.t) return true;
else return false;
}
int main(){
cin>>n>>k;
for(int i = 0; i < n; i++){
recode a;
cin>>a.pname;
int hh, mm, ss;
scanf("%d:%d:%d",&hh,&mm,&ss);
a.t=changetime(hh,mm,ss);
string s;
cin>>s;
if(s == "in"){
a.in = true;
}
else{
a.in = false;
}
all_recodes.push_back(a);
}
sort(all_recodes.begin(),all_recodes.end(),compare);
// printf("\n");
// for(int i = 0; i < all_recodes.size();i++){
// printf("%s %d:%d:%d %d\n",all_recodes[i].pname.c_str(),all_recodes[i].t/3600,all_recodes[i].t%3600/60,all_recodes[i].t%3600%60,all_recodes[i].in);
//
// }
for(int i = 0; i < all_recodes.size()-1; i++){
if(all_recodes[i].pname == all_recodes[i+1].pname && all_recodes[i].in == true && all_recodes[i+1].in == false){
right_recodes.push_back(all_recodes[i]);
right_recodes.push_back(all_recodes[i+1]);
mp[all_recodes[i].pname] += all_recodes[i+1].t - all_recodes[i].t;
// printf("%s %02d:%02d:%02d in\n",all_recodes[i].pname.c_str(),all_recodes[i].t/3600,all_recodes[i].t%3600/60,all_recodes[i].t%3600%60);
// printf("%s %02d:%02d:%02d out\n",all_recodes[i+1].pname.c_str(),all_recodes[i+1].t/3600,all_recodes[i+1].t%3600/60,all_recodes[i+1].t%3600%60);
i++;
}
}
sort(right_recodes.begin(),right_recodes.end(),comparetime);
int count = 0;
int j = 0;
for(int i = 0; i < k; i++){
int hh, mm, ss;
scanf("%d:%d:%d",&hh,&mm,&ss);
int qt = changetime(hh, mm, ss);
while(right_recodes[j].t <= qt && j<right_recodes.size()){
if(right_recodes[j].in == true) count++;
else count--;
j++;
}
printf("%d\n",count);
}
int maxt = 0;
vector<string> max;
for(map<string,int>::iterator it = mp.begin(); it != mp.end(); it++){
if(it->second > maxt){
maxt = it->second;
max.clear();
max.push_back(it->first);
}
else if(maxt == it->second){
max.push_back(it->first);
}
}
for(int i = 0; i < max.size(); i++){
printf("%s ",max[i].c_str());
}
printf("%02d:%02d:%02d",maxt/3600,maxt%3600/60,maxt%3600%60);
return 0;
}
本文介绍了一种处理有序时间记录的方法,通过将记录排序并遍历一次来高效获取所需结果。文章提供了一个完整的C++实现示例,展示了如何处理进出记录,并统计特定时间段内的人数及最长时间段的人员名单。
2601

被折叠的 条评论
为什么被折叠?



