PAT A1095 题解

#include<bits/stdc++.h>
using namespace std;

struct Record
{
    char number[9];
    int seconds;
    char status[4];
}r[10000];

bool cmp(Record r1, Record r2)
{
    if(strcmp(r1.number, r2.number))
        return strcmp(r1.number, r2.number) < 0;
    else
        return r1.seconds < r2.seconds;
}

struct Car
{
    char number[9];
    int in_s[10];
    int out_s[10];
    int delta_s;
    int period = 0;
}c[5000];
int con = 0;

bool cmp_d(Car c1, Car c2)
{
    if (c1.delta_s != c2.delta_s)
        return c1.delta_s > c2.delta_s;
    else
        return strcmp(c1.number, c2.number) < 0;
}

int main()
{
    int n, k;
    cin >> n >> k;
    for(int i = 0; i < n; i++)
    {
        int hh,mm,ss;
        scanf("%s %d:%d:%d %s", r[i].number, &hh, &mm, &ss, r[i].status);
        r[i].seconds = hh * 3600 + mm * 60 + ss;
    }
    sort(r, r + n, cmp);
    char now_num[9];
    strcpy(now_num, r[0].number);
    int in = 0, out = 0;
    bool find_in = 0, find_out = 0;
    for(int i = 0; i < n; i++)
    {
        if (strcmp(r[i].number, now_num))
        {
            strcpy(now_num, r[i].number);
            con++;
            find_in = 0;
            find_out = 0;
        }
        if (r[i].status[0] == 'i')
        {
            find_in = 1;
            in = i;
        }
        else if (r[i].status[0] == 'o' && find_in && !find_out )
        {
            out = i;
            strcpy(c[con].number, now_num);
            c[con].in_s[c[con].period] = r[in].seconds;
            c[con].out_s[c[con].period] = r[out].seconds;
            c[con].delta_s += r[out].seconds - r[in].seconds;
            c[con].period++;
            find_in = 0;
            find_out = 0;
        }
    }
    con++;
    for(int i = 0; i < k; i++)
    {
        int hh, mm, ss;
        scanf("%d:%d:%d", &hh, &mm, &ss);
        int seconds = hh * 3600 + mm * 60 + ss;
        int sum = 0;
        for(int ii = 0; ii < con; ii++)
        {
            for(int iii = 0; iii < c[ii].period; iii++)
                if (c[ii].in_s[iii] <= seconds && c[ii].out_s[iii] > seconds)
                {
                    sum++;
                    break;
                }
        }
        printf("%d\n", sum);
    }
    sort(c, c + con, cmp_d);
    int i = 0;
    do
    {
        printf("%s ", c[i].number);
        i++;
    }while(i < con && c[i].delta_s == c[i - 1].delta_s);
    printf("%02d:%02d:%02d", c[i - 1].delta_s / 3600, c[i - 1].delta_s % 3600 / 60,
                c[i - 1].delta_s % 60);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值