【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;
}

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