1705: 小明在工作(zzuli)

题目描述

小明的工作是负责记录饭堂中正在排队的人的信息 
在他的工作中会有三种可能的事件发生: 
    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校赛-初赛 

 1 #include<iostream>
 2 #include<queue>
 3 #include<cstdio>
 4 #include<string>
 5 #include<list>
 6 using namespace std;
 7  
 8 list<string> q;
 9 list<string>::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     else
27     {
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,可是只支持往后添加和删除元素,

哎,无奈!

posted @ 2018-04-14 12:49  zzuli风尘  阅读(156)  评论(0编辑  收藏  举报