1705: 小明在工作(zzuli)

时间:2023-03-08 15:37:07

题目描述

小明的工作是负责记录饭堂中正在排队的人的信息 
在他的工作中会有三种可能的事件发生: 
    1.编号为id的学生加入到队伍的最后面 
    2.排在最前面的学生打完饭离开了队伍 
    3.老板过来询问当前排在队伍前方第k个的学生的编号 
由于每天的工作量太大(每天最多有100000个以上事件发生), 
小明苦不堪言,让你写个程序帮他

输入

输入的第一个数是正整数T,表明接下来有T组数据 
每组数据的第一个数为正整数n,表示有n件事会发生 
接下来有n行,每行分别表示上诉三种事件的其中一种,格式分别如下: 
1 id 

3 k 
注意当队伍中已经没人的时候请忽略第2种事件,每组数据新开始的时候队伍中人数都为0

输出

对于给个第3种的事件,请输出第k个学生的编号, 
如果队伍的人数小于k,输出“na li you zhe me duo ren”。

样例输入

2
5
1 1
1 2
3 1
2
3 1
2
1 1
3 2

样例输出

1
2
na li you zhe me duo ren

来源

2015广东工业大学ACM校赛-初赛

 #include<iostream>
#include<queue>
#include<cstdio>
#include<string>
#include<list>
using namespace std; list<string> q;
list<string>::iterator p;
void push()
{
string s;
cin >> s;
q.push_back(s);
}
void likai()
{
q.pop_front();
}
void find()
{
int k;
scanf("%d", &k);
if (q.empty()||q.size() < k)
cout << "na li you zhe me duo ren" << endl;
else
{
p = q.begin();
for (int i = ; i < k - ; i++)
p++;
cout << *p << endl;
}
}
int main()
{
int t,k;
cin >> t;
while (t--)
{
q.clear();
scanf("%d", &k);
while (k--)
{
int temp;
cin >> temp;
if (temp == && q.empty()) continue;
switch (temp)
{
case : push(); break;
case : likai(); break;
case : find();break;
}
}
}
return ;
}

对于此题我表示深深的痛苦,不过这个题对我来说帮助蛮大的,至少让我又复习了一下stl的queue队列,vector,list;

刚开始用的队列,发现好像要用到遍历,尴尬,队列不能随机访问,后面又用了vector,可是只支持往后添加和删除元素,

哎,无奈!