1095. Cars on Campus (30)

题目地址:http://www.patest.cn/contests/pat-a-practise/1095

这题处理起来比较繁,充分考察C++ STL 的使用
下面是ac代码,仍需要大量优化

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <string>
#include <string.h>
#include <queue>
#include <unordered_map>
#include <algorithm>

using namespace std;

#define N 10001
#define K 80001

int n, kk;

struct jilu{
  //plate_number hh : mm : ss status // in-true out-false
  string plate_number;
  int hh, mm, ss;
  bool state;
};

vector<jilu> v;

//unordered_map<string, int> umstr2int;
//unordered_map<int, string> umint2str;



struct timet{
  int hh, mm, ss;
  timet(int _hh = 0, int _mm = 0, int _ss = 0)
  {
    hh = _hh;
    mm = _mm;
    ss = _ss;
  }
};

bool cmp(jilu j1, jilu j2)
{
  if (j1.hh < j2.hh)
    return true;
  if (j1.hh == j2.hh && j1.mm < j2.mm)
    return true;
  if (j1.hh == j2.hh && j1.mm == j2.mm && j1.ss < j2.ss)
    return true;
  return false;
}

bool cmp2(jilu j1, jilu j2)
{
  if (j1.plate_number < j2.plate_number)
    return true;
  if (j1.plate_number == j2.plate_number){
    if (j1.hh < j2.hh)
      return true;
    if (j1.hh == j2.hh && j1.mm < j2.mm)
      return true;
    if (j1.hh == j2.hh && j1.mm == j2.mm && j1.ss < j2.ss)
      return true;
  }
  return false;
}

bool cmptimet(timet j1,timet j2)
{
  if (j1.hh < j2.hh)
    return true;
  if (j1.hh == j2.hh && j1.mm < j2.mm)
    return true;
  if (j1.hh == j2.hh && j1.mm == j2.mm && j1.ss <= j2.ss)
    return true;
  return false;
}

int gettimet(int hh, int mm, int ss)
{
  return hh * 3600 + mm * 60 + ss;
}

int main()
{
  //freopen("in", "r", stdin);
  scanf("%d%d", &n, &kk);
  int i, j;
  jilu jit;
  char statet[4];
  for (i = 0; i < n; i++)
  {
    cin >> jit.plate_number;
    scanf("%d:%d:%d", &jit.hh, &jit.mm, &jit.ss);

    scanf("%s", statet);
    if (statet[0] == 'i')
      jit.state = true;
    else
      jit.state = false;
    if (gettimet(jit.hh, jit.mm, jit.ss) >= gettimet(0, 0, 0) &&
      gettimet(jit.hh, jit.mm, jit.ss) < gettimet(24, 0, 0))
    {
      v.push_back(jit);
    }
  }
  // 下面是处理那些不匹配的
  sort(v.begin(), v.end(), cmp2);
  vector<jilu> v2;
  string curname = "";
  bool flag = false;
  for (i = 0; i < n; i++)
  {
    jilu jtmp = v[i];
    if (flag == false && jtmp.state == true)
    {
      v2.push_back(jtmp);
      flag = true;
      curname = jtmp.plate_number;
    }
    else if (flag == true && jtmp.state == true){
      v2.pop_back();
      v2.push_back(jtmp);
      flag = true;
      curname = jtmp.plate_number;
    }
    else if (flag == true && jtmp.plate_number == curname && jtmp.state == false)
    {
      v2.push_back(jtmp);
      flag = false;
    }
  }
  if ((*(v2.end() - 1)).state == true)
    v2.pop_back();

  // v2 处理完毕

  int maxx = 0;
  vector<string> rs;
  //vector<int> rs2;
  //vector<timet> rs3;
  unordered_map<string, int> um;
  int len2 = v2.size();
  timet tt;
  for (i = 0; i < len2; i+=2)
  {
    jilu t1 = v2[i];
    jilu t2 = v2[i + 1];
    int totaltimet = gettimet(t2.hh, t2.mm, t2.ss) - gettimet(t1.hh, t1.mm, t1.ss);
    //rs.push_back(t1.plate_number);
    //rs2.push_back(totaltimet);
    tt.hh = t2.hh; 
    tt.mm = t2.mm; 
    tt.ss = t2.ss;
    //rs3.push_back(tt);
    um[t1.plate_number] += totaltimet;
    if (um[t1.plate_number] > maxx)
    {
      rs.clear();
      rs.push_back(t1.plate_number);
      maxx = um[t1.plate_number];
    }
    else if (um[t1.plate_number] == maxx){
      rs.push_back(t1.plate_number);
    }
  }

// 对 v2的每一个时间点 都记录下Cars
  sort(v2.begin(), v2.end(), cmp);
  // 时间段 人数
  int len22 = v2.size();
  int num = 0;
  vector<int> nums; // 按照 v2 排序后的时间进行统计
  for (i = 0; i < len22; i++)
  {
    if (v2[i].state)
    {
      num++;
    }
    else{
      num--;
    }
    nums.push_back(num);
  }

  timet ttmp;
  int numm = 0;
  for (i = 0; i < kk; i++)
  {
    scanf("%d:%d:%d", &ttmp.hh, &ttmp.mm, &ttmp.ss);

    for (j = numm; j < len2; j++)
    {
      timet tmp;
      tmp.hh = v2[j].hh;
      tmp.mm = v2[j].mm;
      tmp.ss = v2[j].ss;
      if (cmptimet(tmp, ttmp))
      {
        numm++;
        // 下面两句不写 会出错 因为可能查询时间比输入的最大时间都大 ,不会跳到下面的else里面去
        if (j == len2 - 1)
          printf("%d\n", nums[numm - 1]);
      }
      else{
        printf("%d\n", nums[numm - 1]);
        break;
      }
    }
  }

  int rsLen = rs.size();
  for (i = 0; i < rsLen; i++)
  {
    cout << rs[i] << " ";
  }
  int h = maxx / 3600;
  int m = maxx / 60 - h * 60;
  int s = maxx % 60;
  printf("%02d:%02d:%02d\n",h,m,s);

  return 0;
}

你可能感兴趣的:(c++-stl)