【PAT甲级】1095Cars on Campus笔记及知识点

题目大意:

给出n个⻋牌号、时间点、进出状态的记录,然后查询k个时间点这时校园内的⻋辆个数。
最后还要输出在校园⾥⾯呆的时间最⻓的⻋的⻋牌号,以及呆了多久的时间。如果有多辆⻋就按照它
的字⺟从⼩到⼤输出⻋牌

知识点笔记

  1. vector
vector <string> v;
forint i=0;i!=v.end();i++)

这种类型是不支持的,因为i和vector的类型不同,v.end()返回的是最后一个点的值,并不是索引。v.begin() 和v.end()均指向值,而v.size()指向个数

":: : "在C++中表示作用域,和所属关系
std:: 是个名称空间标示符,C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准函数库中的函数或对象都要使用std来限定。
vector::iterator : 向量型作用下的迭代器

段错误:很大程度上可能为未考虑到0,1等的情况,可以试着往这方面改进。

注意点

  • 刚开始想简单了,在配对的时候,有很多进入和出去的记录,取两个相邻最近的。如:进1 进2 进3 出1 出2 进4 出3 。则有效数据为 进3 出1 进4 出3。这个点,非常重要,以后看题的时候,可以试着用样例验证自己的结论,来完全理解题意。
#include <cstdio>
#include<algorithm>
#include<iostream>
#include<string>
#include<set>
#include<vector>
#include<map>

using namespace std;
struct node
{
    string name;
    int h,m,s;
    int num;
    int status;
}time1[100000];
set<string> set1;
int cmp1(node &t1, node &t2)
{
   if(t1.num!=t2.num) return t1.num<t2.num;
   return t1.name<t2.name;
}
int cmp2(node &t1, node &t2)
{
   if(t1.name!=t2.name) return t1.name<t2.name;
   return t1.num<t2.num;
}
int main() {
    int n,k;
    string s,s1;
    int ht,mt,st;
    scanf("%d %d",&n, &k);
    int query[k];
    for(int i=0;i<n;i++)
    {
        cin>>s;
        scanf("%d:%d:%d",&ht, &mt, &st);
        cin>>s1;
        if(s1=="in")time1[i].status=1;
        else time1[i].status=0;
        int num=ht*60*60+mt*60+st;
        time1[i]={s,ht,mt,st,num,time1[i].status};
    }
    sort(time1,time1+n,cmp2);
    int maxx=-1;
    vector<node> car;
    vector<string> v;
    map<string,int> m;
    for(int i=0;i<n;i++)
        if(time1[i].name==time1[i+1].name && time1[i].status==1 &&time1[i+1].status==0)
    {
        car.push_back(time1[i]);
        car.push_back(time1[i+1]);
        m[time1[i].name]+=time1[i+1].num-time1[i].num;
        if(maxx<m[time1[i].name])
         {
             maxx=m[time1[i].name];
             v.clear();
             v.push_back(time1[i].name);
         }
        else if(maxx==m[time1[i].name])
        {
           v.push_back(time1[i].name);
        }
    }
    for(int i=0;i<k;i++)
    {
       scanf("%d:%d:%d",&ht, &mt, &st);
       int num=ht*60*60+mt*60+st;
       car.push_back({"a",0,0,0,num,-1});
    }
    sort(car.begin(),car.end(),cmp1);
    int total=0;
    for(int i=0;i<car.size();i++)
    {
        if(car[i].status==1) total++;
        if(car[i].status==0) total--;
        if(car[i].status==-1) cout<<total<<endl;
    }
    for(int i=0;i<v.size();i++)
        cout<<v[i]<<" ";
    printf("%02d:%02d:%02d",maxx/3600,(maxx%3600)/60,maxx%60);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章