题目描述
小明的工作是负责记录饭堂中正在排队的人的信息
在他的工作中会有三种可能的事件发生: 1.编号为id的学生加入到队伍的最后面 2.排在最前面的学生打完饭离开了队伍 3.老板过来询问当前排在队伍前方第k个的学生的编号 由于每天的工作量太大(每天最多有100000个以上事件发生), 小明苦不堪言,让你写个程序帮他输入
输入的第一个数是正整数T,表明接下来有T组数据
每组数据的第一个数为正整数n,表示有n件事会发生 接下来有n行,每行分别表示上诉三种事件的其中一种,格式分别如下: 1 id 2 3 k 注意当队伍中已经没人的时候请忽略第2种事件,每组数据新开始的时候队伍中人数都为0输出
对于给个第3种的事件,请输出第k个学生的编号,
如果队伍的人数小于k,输出“na li you zhe me duo ren”。样例输入
251 11 23 123 121 13 2
样例输出
12na li you zhe me duo ren
来源
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 list
q; 9 list ::iterator p;10 void push()11 {12 string s;13 cin >> s;14 q.push_back(s);15 }16 void likai()17 {18 q.pop_front();19 }20 void find()21 {22 int k;23 scanf("%d", &k);24 if (q.empty()||q.size() < k)25 cout << "na li you zhe me duo ren" << endl;26 else27 {28 p = q.begin();29 for (int i = 0; i < k - 1; i++)30 p++;31 cout << *p << endl;32 }33 }34 int main()35 {36 int t,k;37 cin >> t;38 while (t--)39 {40 q.clear();41 scanf("%d", &k);42 while (k--)43 {44 int temp;45 cin >> temp;46 if (temp == 2 && q.empty()) continue;47 switch (temp)48 {49 case 1: push(); break;50 case 2: likai(); break;51 case 3: find();break;52 }53 }54 }55 return 0;56 }
对于此题我表示深深的痛苦,不过这个题对我来说帮助蛮大的,至少让我又复习了一下stl的queue队列,vector,list;
刚开始用的队列,发现好像要用到遍历,尴尬,队列不能随机访问,后面又用了vector,可是只支持往后添加和删除元素,
哎,无奈!