PAT A1095
时间:2021-07-21 17:35:37
收藏:0
阅读:0
30分的题,喜大普奔
总思路的话,就是读入一堆信息以后,先按id/time(这个的意思是先排序Id,再排序time)的顺序sort一下,然后找两两配对放进一个数组里,这个时候你也要记录下时间来。然后跑一遍那个数组就可以找出所有最大。至于询问的话就跑一遍那个时间数组。
这个题想想思路也不是很费劲嘛,就提几个注意点吧。
-
这个是我当时的一个坑,就是如果那个车没有匹配的in & out,它都不会参与数车,也就是说,这个筛选你需要在所有东西之前进行
-
要注意同一辆车可能要开进来很多次,所以你得去找map里的匹配,然后去加,而不是每次都重新找一个匹配。 -
这个题一个卡时间的地方就是询问。其实询问是升序的话就跑一遍就可以了
tips:
-
把时间变成秒可以简化很多!!!!这是处理时间的一个技巧。
-
如果只需要输出一个最大值(可能是按某种排序排出来的),那只需要跑一遍数组就可以、(一直记录一个maxn)
如果需要全部输入那就得跑两遍,先找maxn,再找所有与maxn相等的值(但是你可以输入的时候就把那个maxn找出来) -
printf不能直接输出char *类型,所以你需要一个函数:
*啊,要注意iterator的写法
#include<iostream>
#include<vector>
#include <unordered_set>
#include <map>
#include <cstring>
#include <stdio.h>
#include <algorithm>
using namespace std;
//转换成以秒为单位
//询问是按升序给出的
struct Car{
char id[10];
int time;
bool in_1;
}cars[100000];
map<string,int> mmp;
int change_to_s(int h,int m,int s){
return h*3600+m*60+s;
}
bool cmpbyidandtime(Car car1,Car car2){
if(strcmp(car1.id,car2.id))
return strcmp(car1.id,car2.id)<0;//从小到大排序
else{
return car1.time<car2.time;
}
}
bool cmpbytime(Car car1,Car car2){
return car1.time<car2.time;
}
int main(){
int car_num;
int q_num;
scanf("%d %d",&car_num,&q_num);
for (int i = 0; i < car_num; ++i) {
char temp[100];
int h;
int m;
int s;
scanf("%s %d:%d:%d %s",cars[i].id,&h,&m,&s,temp);
cars[i].time=change_to_s(h,m,s);
if(temp[0]==‘o‘){
cars[i].in_1= false;
}
else{
cars[i].in_1= true;
}
}
sort(cars,cars+car_num,cmpbyidandtime);
int maxn;
Car valid[100000];//record the car,,,,直接声明成Car形就可以
int num=0;
for (int i = 1; i < car_num; ++i) {
if(!strcmp(cars[i].id,cars[i-1].id) && cars[i-1].in_1== true && cars[i].in_1== false){
if(mmp.count(cars[i].id)==0){
mmp[cars[i].id]=0;
}
valid[num++]=cars[i-1];
valid[num++]=cars[i];
mmp[cars[i].id]+=(cars[i].time-cars[i-1].time);//注意同一辆车可能开进来很多次
maxn=max(mmp[cars[i].id],maxn);
}
}
sort(valid,valid+num,cmpbytime);
//输出valid的所有信息 ok
// for (int i = 0; i < num; ++i) {
// cout<<valid[i].id<<" "<<valid[i].time<<" "<<valid[i].in_1<<endl;
// }
int now_comp=0;
int now_car=0;
for (int i = 0; i < q_num; ++i) {
int h;
int m;
int s;
scanf("%d:%d:%d",&h,&m,&s);
int nowtime=change_to_s(h,m,s);
//输出时间
//cout<<"nowtime"<<nowtime<<endl;
for (int j = now_comp; j < num; ++j) {//因为询问升序,每次保留当前记录就行
if(valid[j].time<=nowtime && valid[j].in_1)//in_time<nowtime,now_car++
now_car++;
if(valid[j].time<=nowtime && !valid[j].in_1){
now_car--;
}
if(valid[j].time>nowtime){
now_comp=j;
break;
}
}
printf("%d\n",now_car);
}
map<string,int>::iterator it;
for(it =mmp.begin();it!=mmp.end();it++){
if(it->second==maxn)
printf("%s ",it->first.c_str());
}
printf("%02d:%02d:%02d",maxn/3600,maxn%3600/60,maxn%60);
}
评论(0)