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的时间的。
所以一开始选择算法的时候没有考虑这种。
这次也了解了,当你的代码有答案错误的时候,即使有格式错误也会显示答案错误。
只有当你的答案没问题的时候,有格式错误,才会显示格式错误。
继续加油!
阅读全文
0 0
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- 1095. Cars on Campus (30)
- php显示所有文件封装函数
- ajax功能1-servlet
- C++中cout输出字符型指针地址值的方法
- AGC 013
- Centos国内下载源
- 1095. Cars on Campus (30)
- 列表和元组
- 2017.10.26 四校联测D1
- GNU RADIO中常见模块的作用
- pytorch初学(1)(安装及入门)
- 一个故事来说NIO
- nagios(centos7.3环境) 的源码安装
- Java开发环境的搭建以及使用eclipse从头一步步创建java项目
- STL之set