停车场统计收费[100分]
/免费时段重叠时间,防止不在重叠区间出现负值。//it->first是车牌号,it->second是vector<pair<int, int>>进出时间数组。//按车牌分组,键值string车牌号,值:进出时间(可能同一辆车多次进出)vector<Info> vec;//存放所有不包月的车的进出信息。
#include<iostream>
#include<string>
#include<sstream>
#include<vector>
#include<unordered_set>
#include<unordered_map>
#include<algorithm>
using namespace std;
struct Info {
string time;
string carid;
string enorle;
};
int toMinutes(string time) {
stringstream ss(time);
int hour;
char ch;
int minute;
ss >> hour >> ch >> minute;
return hour * 60 + minute;
}
int cost(int start, int end) {
if (end - start < 30) {
return 0;
}
int startex = 11 * 60 + 30;
int endex = 13 * 60 + 30;
int lasting = end - start;
int overlap = max(0,min(end, endex) - max(start, startex));//免费时段重叠时间,防止不在重叠区间出现负值
lasting -= overlap;
if (lasting >= 8 * 60) {
return 8 * 2;
}
else {
/*return lasting % 30 ? (lasting / 30 + 1 ): (lasting / 30);*/
return (lasting + 29) / 30;
}
}
int main() {
int n;
cin >> n;
cin.ignore();
string temp;
getline(cin, temp);
stringstream ss(temp);
unordered_set<string> uset;
string t;
for (int i = 0; i < n; i++) {
ss >> t;
uset.insert(t);
}
vector<Info> vec;//存放所有不包月的车的进出信息
string perinfo;
while (getline(cin, perinfo)) {
string curt;
Info cur;
stringstream s1(perinfo);
s1 >> curt;
cur.time = curt;
s1 >> curt;
cur.carid = curt;
if (uset.find(cur.carid) != uset.end()) {
continue;//包月的,不统计
}
s1 >> curt;
cur.enorle = curt;
vec.push_back(cur);
}
//按车牌分组,键值string车牌号,值:进出时间(可能同一辆车多次进出)
unordered_map<string, vector<pair<int, int>>> ump;
for (Info it : vec) {
string curid = it.carid;
if (it.enorle == "enter") {
int start = toMinutes(it.time);
ump[curid].push_back({start,-1});//用-1先占位
}
else {
int end = toMinutes(it.time);
ump[curid].back().second = end;//代替-1
}
}
int res = 0;
for (auto it = ump.begin(); it != ump.end(); it++) {
//it->first是车牌号,it->second是vector<pair<int, int>>进出时间数组
vector<pair<int, int>> curidinfo= it->second;
for (int i = 0; i < curidinfo.size(); i++) {
res+=cost(curidinfo[i].first, curidinfo[i].second);
}
}
cout << res;
return 0;
}
更多推荐
所有评论(0)