zoukankan      html  css  js  c++  java
  • PAT甲级 1095 Cars on Campus (30分)(map + 排序)

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include <map>
     6 using namespace std;
     7 const int maxn = 200005;
     8 typedef long long ll;
     9 struct car1 {
    10     char number[10],state[10];
    11     int length;
    12 }c1[10005],c2[10005];
    13 
    14 bool cmp1(car1 p,car1 q) {
    15     if(strcmp(p.number,q.number) != 0) return strcmp(p.number,q.number) < 0;
    16     else if(p.length != q.length) return p.length < q.length;
    17     return strcmp(p.state,q.state) < 0;
    18 }
    19 bool cmp2(car1 p,car1 q) {
    20     return p.length < q.length;
    21 }
    22 int query[90005];//存储查询时间
    23 map<string,int>mp;
    24 int main() {
    25     int n,mm;
    26     int k = 0;//有效记录数
    27     int h,m,s;
    28     int maxtime = 0;//停留的最长时间
    29     scanf("%d%d",&n,&mm);
    30     for(int i = 0; i < n; i++) {
    31         scanf("%s %d:%d:%d %s",c1[i].number,&h,&m,&s,c1[i].state);
    32         c1[i].length = h*3600 + m*60 + s;//换算成秒 容易比较
    33     }
    34     for(int i = 0; i < mm; i++) {
    35         scanf("%d:%d:%d",&h,&m,&s);//将查询时间也换成秒
    36         query[i] = h*3600 + m*60 +s;
    37     }
    38     sort(c1,c1+n,cmp1);
    39     for(int i = 0; i < n-1; i++) {
    40         if(strcmp(c1[i].number,c1[i+1].number) == 0 && strcmp(c1[i].state,"in") == 0 && strcmp(c1[i+1].state,"out") == 0) {//如果匹配
    41             strcpy(c2[k].number,c1[i].number);
    42             c2[k].length = c1[i].length;
    43             strcpy(c2[k++].state,c1[i].state);
    44             strcpy(c2[k].number,c1[i+1].number);
    45             c2[k].length = c1[i+1].length;
    46             strcpy(c2[k++].state,c1[i+1].state);
    47             mp[c1[i].number] += c1[i+1].length - c1[i].length;
    48             maxtime = max(maxtime,mp[c1[i].number]);//找到在停车场最长的停车时间
    49         }
    50     }
    51     sort(c2,c2+k,cmp2);//将有效记录的车的时间按从小到大排序
    52     int now = 0;
    53     int car = 0;
    54     //复杂度变成了O(n+m) !!!
    55     //已知查询时间是从小到大的
    56     for(int i = 0; i < mm; i++) {//关键 用now存储不大于该查询时间的车辆的时间
    57         while(c2[now].length <= query[i]&& now < k) {//k是有效记录数 now一定要小于k 否则段错误!!
    58             if(string(c2[now].state) == "in") car++; //如果车辆的状态是in 则停车场中车数++
    59             else car--;//否则车数--
    60             now++;//判断下一辆车
    61         }
    62         printf("%d
    ",car);
    63     }
    64     map<string,int>::iterator it;
    65     for(it = mp.begin(); it != mp.end(); it++) {
    66         if(it->second == maxtime) printf("%s ",it->first.c_str());
    67     }
    68     h = maxtime / 3600;
    69     m = maxtime % 3600 /60;
    70     s = maxtime % 3600 % 60;
    71     printf("%02d:%02d:%02d",h,m,s);
    72     return  0;
    73 }
  • 相关阅读:
    AddressFamily 枚举指定 Socket 类的实例可以使用的寻址方案
    在.NET开发中灵活使用TreeView控件
    TreeView初始化,返回节点值的方法(转)收藏
    怎样彻底删除系统服务项(转载)
    SQL Server 返回插入记录的自增编号(转)
    Socut.Data.dll 与AspNetPager.dll使用说明及心得体会 (转载)
    ActionScript最新3D引擎项目(转载)
    XP自动搜索功能修复
    Postgresql 重新安装,数据不丢失
    work with postgis & geoserver
  • 原文地址:https://www.cnblogs.com/LLLAIH/p/12264842.html
Copyright © 2011-2022 走看看