1095. Cars on Campus (30)解题报告

来源:互联网 发布:mac怎么换壁纸 编辑:程序博客网 时间:2024/06/12 00:19

先读入所有数据,对数据按照时间顺序排列,然后依次对in和out进行匹配,按照时间顺序将合法的停车信息存入向量,并统计每一个牌照的停车时间。接着统计一天中的每一秒停车场所停的车辆数。最后读取查询要求,输出结果。


#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <vector>#include <map>#include <string>using namespace std;enum Status{in, out};struct node{char pnum[10];int hour, min, sec;Status s;};int convert(int hour, int min, int sec);void strcopy(char str[], string &s);int cmp(const void *v1, const void *v2);const int N = 24 * 3600;int main(int argc, char** argv) {int n, k, i, j, inCnt, outCnt, time1, time2, *left, maxTime = 0;char s[10], str[10];node tmp, *arr;vector<node> *h;vector<string> v;map<string, node> record;map<string, node>::iterator it;map<string, int> time;map<string, int>::iterator time_it;setvbuf(stdin, new char[1 << 20], _IOFBF, 1 << 20);setvbuf(stdout, new char[1 << 20], _IOFBF, 1 << 20);h = new vector<node>[N];left = new int[N];memset(left, 0, sizeof(int) * N);scanf("%d %d", &n, &k);arr = new node[n];for(i = 0; i < n; i++){scanf("%s %d:%d:%d %s", arr[i].pnum, &arr[i].hour, &arr[i].min, &arr[i].sec, s);if(!strcmp(s, "in")){arr[i].s = in;}else{arr[i].s = out;}}qsort(arr, n, sizeof(node), cmp);for(i = 0; i < n; i++){tmp = arr[i];it = record.find(string(tmp.pnum));if(it == record.end() && tmp.s == in){record.insert({string(tmp.pnum), tmp});}else if(it != record.end()){if(it->second.s == in && tmp.s == out){time1 = convert(it->second.hour, it->second.min, it->second.sec);time2 = convert(tmp.hour, tmp.min, tmp.sec);time_it = time.find(string(tmp.pnum));if(time_it == time.end()){time.insert({string(tmp.pnum), time2 - time1});}else{time_it->second += time2- time1;}h[time1].push_back(it->second);h[time2].push_back(tmp);record.erase(it);}else if(it->second.s == in && tmp.s == in){it->second = tmp;}}}for(time_it = time.begin(); time_it != time.end(); time_it++){if(maxTime < time_it->second){maxTime = time_it->second;v.clear();v.push_back(time_it->first);}else if(maxTime == time_it->second){v.push_back(time_it->first);}}for(i = 0; i < N; i++){inCnt = outCnt = 0;if(i == 0){inCnt = h[i].size();left[i] = inCnt;}else{for(j = 0; j < h[i].size(); j++){if(h[i][j].s == in){inCnt++;}else{outCnt++;}}left[i] = left[i - 1] + inCnt - outCnt;}}int hour, min, sec;for(i = 0; i < k; i++){scanf("%d:%d:%d", &hour, &min, &sec);time1 = convert(hour, min, sec);printf("%d\n", left[time1]);}sort(v.begin(), v.end());for(i = 0; i < v.size(); i++){strcopy(str, v[i]);printf("%s ", str);}printf("%02d:%02d:%02d", maxTime / 3600, (maxTime % 3600) / 60, (maxTime % 3600) % 60);delete[] left;delete[] arr;delete[] h;return 0;}int convert(int hour, int min, int sec){return (hour * 60 + min) * 60 + sec;}void strcopy(char str[], string &s){int i = 0;while(i < s.length()){str[i] = s[i];i++;}str[i] = '\0';return;}int cmp(const void *v1, const void *v2){node *n1, *n2;int time1, time2;n1 = (node *)v1;n2 = (node *)v2;time1 = convert(n1->hour, n1->min, n1->sec);time2 = convert(n2->hour, n2->min, n2->sec);return time1 - time2;}

0 0
原创粉丝点击