1095. Cars on Campus (30)

来源:互联网 发布:mysql 解锁 编辑:程序博客网 时间:2024/05/22 08:15

又是一道卡了我很久的题目。
再次吐槽一下PAT对于stl和cin/cout太不友好了。
下面先贴一下代码吧。
(有时候AC有时候TLE,全换成char* 就没有问题了,但是鉴于打比赛的时候不可能用char* ,我这里就不改了)

#include <bits/stdc++.h>using namespace std;struct car{  string name;  string time;  string sta;};bool cmp(const car& a, const car& b){  if (a.name != b.name) return a.name < b.name;  else  {    return a.time < b.time;  }}bool cm(const car& a, const car& b){    return a.time < b.time;}int main(void){  int n, m;  cin >> n >> m;  vector<car> arr;  vector<car> jilu;  vector<vector<car> > re;  int i;  for (i = 0; i < n; i++)  {    car temp;    cin >> temp.name >> temp.time >> temp.sta;    arr.push_back(temp);  }  sort(arr.begin(), arr.end(), cmp);  for (i = 0; i < n;)  {    if (i + 1 != n && arr[i].name == arr[i+1].name && arr[i].sta[0] == 'i' && arr[i+1].sta[0] == 'o')    {      jilu.push_back(arr[i]);      jilu.push_back(arr[i+1]);      i += 2;    }    else    {      i++;    }  }  vector<car> temp;  re.push_back(temp);  int t = 0;  for (i = 0; i < jilu.size(); i++)  {    if (i == jilu.size() - 1 || jilu[i].name == jilu[i+1].name) re[t].push_back(jilu[i]);    else    {      re.push_back(temp);      re[t].push_back(jilu[i]);      t++;     }  }  int j;  sort(jilu.begin(), jilu.end(), cm);  int tt = 0;  i = 0;  while (m--)  {    string ti;    cin >> ti;    for (;i < jilu.size() && jilu[i].time <= ti; i++)    {        if (jilu[i].sta[0] == 'i') tt++;        else tt--;    }    printf("%d\n", tt);  }  vector<string> res;  int ti = 0;  int max = -1;  for (i = 0; i < re.size(); i++)  {    ti = 0;    for (j = 1; j < re[i].size(); j += 2)    {      ti += (re[i][j].time[0] - re[i][j-1].time[0]) * 36000 + (re[i][j].time[1] - re[i][j-1].time[1]) * 3600;      ti += (re[i][j].time[3] - re[i][j-1].time[3]) * 600 + (re[i][j].time[4] - re[i][j-1].time[4]) * 60;      ti += (re[i][j].time[6] - re[i][j-1].time[6]) * 10 + (re[i][j].time[7] - re[i][j-1].time[7]);    }    if (ti > max)    {      max = ti;      res.clear();      res.push_back(re[i][0].name);    }    else if (ti == max)    {      res.push_back(re[i][0].name);    }  }  for (i = 0; i < res.size(); i++)  {    cout << res[i] << " ";  }  printf("%02d:", max /3600);  max %= 3600;  printf("%02d:", max /60);  max %= 60;  cout << max / 10 << max % 10;}

一开始三个点超时,就很不开心。
于是自己动手优化算法,结果优化好几个小时并没有什么卵用。
于是屈服了,上网找CSDN。
看到网上的算法确实是要更加优秀一些。
主要也是我看题目不够仔细。
问题出在查询的时候,查询的时间是有顺序的。
这也就意味着,你每次查询不需要从头查询,而是接着上一次查询的地方继续下去就行了。
一开始我是这样的

while (m--)  {    int tt = 0;    char ti[9];    scanf("%s", ti);    for (i = 0; i < re.size(); i++)    {      for (j = 0; j < re[i].size(); j++)      {        if (strcmp(re[i][j].time, ti) > 0) break;      }      if (j != re[i].size() && re[i][j].sta[0] == 'o') tt++;    }    cout << tt << endl;   }

我优化了算法之后是这样的:

 vector<int> index(t + 1);  int tt = 0;  while (m--)  {    char ti[9];    scanf("%s", ti);    for (i = 0; i < re.size(); i++)    {      for (j = index[i]; j < re[i].size(); j++)      {        if (strcmp(re[i][j].time, ti) > 0)        {          index[i] = j;          break;    }        if (re[i][j].sta[0] == 'i') tt++;        else tt--;      }      if (j == re[i].size()) index[i] = re[i].size();    }    printf("%d\n", tt);  }

其实我感觉我算法优化之后应该是能减少很多的时间的。
但是测试点的分数还是没有改观。
可能测试数据实在太大吧。
而按照AC代码里面(参考了别人的代码)。
需要多sort一次。
但是我只知道多sort一次是多一次NlogN的时间的。
所以一开始选择算法的时候没有考虑这种。

这次也了解了,当你的代码有答案错误的时候,即使有格式错误也会显示答案错误。
只有当你的答案没问题的时候,有格式错误,才会显示格式错误。
继续加油!

原创粉丝点击