您的位置:首页 > 其它

FZU 2084--电动车通行证制度 ( 模拟 )

2016-04-14 16:02 357 查看
电动车通行证制度
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d
& %I64u
Submit Status Practice FZU
2084

Description

为了更好地维护校园交通秩序,加强对学校电动车的管理,学校保安叔叔们决定对学生们的电动车进行出入通行证管理。

当电动车进入校门时,保安将发放一张通行证。

当电动车离校时,需要将通行证交还保安,方可放行。

每次电动车进入、离开校园时,都需要记录车牌号。

如果出现异常情况(同一电动车连续2次及以上离开校园,或者连续2次及以上进入校园)电动车将不被放行。

Input

输入第一行为T,表示Case数

每组Case,为一连串的电动车进入/离开校园请求。

“IN 车牌号”:例如IN C-1089,表示车牌号为C-1089的电动车希望进入校园。

“OUT 车牌号”:例如OUT C-1089,表示车牌号为C-1089的电动车希望离开校园。

“LIST”:根据被放行的电动车记录,列出在校内的电动车车牌列表(不被放行的记录不算),按第一次出入的顺序排序。

“EXIT”:该组Case结束

碰到异常情况不放行时,输出一行“Error”

车牌号由大小写字母、数字、‘-’组成,长度不超过10。

命令数不超过10000

Sample Input

2IN ABCIN DEFIN ABCOUT DDDOUT DEFOUT DEFLISTEXITIN aaaIN bbbOUT cccLISTEXIT

Sample Output

Case 1:ErrorErrorABCCase 2:aaabbb

题意:给出一系列的进出车记录,每当给出命令 LIST,你需要按进出车记录顺序给出

当前在学校的车辆名,当某车名连续 2 次及以上进入或离开校园则当错误处理,

不放行,即使一开始没给出某辆车的进车记录,只有离开记录时是正常的,此时

记录下此车记录,便于按序输出。

分析:用map做车名与下标(1开始)的映射。(不重复)

vis[]=1表示车在校,0为车不在校。

flag[i]记录map中第 i 个记录的车输入的下标。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <map>
#include <string>
#include <utility>
#include <functional>
#include <algorithm>
using namespace std;
#define N 12000
#define inf 0x3f3f3f3f
int vis
, flag
;
char car
[12];
int main()
{
#ifdef OFFLINE
freopen("t.txt", "r", stdin);
#endif
int  t, p, i, j, k, num, test = 0;
scanf("%d", &t);
while (t--)
{
printf("Case %d:\n", ++test);
memset(vis, 0, sizeof(vis));
memset(flag, 0, sizeof(flag));
char state[12];
k = p = 0;
num = -1;
map<char*, int> check;
while (cin >> state){
if (strcmp(state, "EXIT") == 0)  break;
if (strcmp(state, "LIST") == 0){
for (i = 0; i < check.size(); i++){
if (vis[i + 1])
printf("%s\n", car[flag[i + 1]]);
}
}
else{
p++;
cin >> car[p];
if (strcmp(state, "IN") == 0){
num = -1;
map<char*, int>::iterator it;
for (it = check.begin(); it != check.end(); it++){
if (strcmp(it->first, car[p]) == 0){
num = it->second; break;
}
}
if (num < 0){
check[car[p]] = ++k;
vis[k] = 1;
flag[k] = p;
}
else{
if (vis[num])
puts("Error");
else
vis[num] = 1;
}
}
else if (strcmp(state, "OUT") == 0){
num = -1;
map<char*, int>::iterator it;
for (it = check.begin(); it != check.end(); it++){
if (strcmp(it->first, car[p]) == 0){
num = it->second; break;
}
}
if (num < 0){
check[car[p]] = ++k;
vis[k] = 0;
flag[k] = p;
}
else {
if (vis[num])
vis[num] = 0;
else
puts("Error");
}
}
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: