小明的工作是负责记录饭堂中正在排队的人的信息
在他的工作中会有三种可能的事件发生:
1.编号为id的学生加入到队伍的最后面
2.排在最前面的学生打完饭离开了队伍
3.老板过来询问当前排在队伍前方第k个的学生的编号
由于每天的工作量太大(每天最多有100000个以上事件发生),
小明苦不堪言,让你写个程序帮他
小明的工作是负责记录饭堂中正在排队的人的信息
在他的工作中会有三种可能的事件发生:
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”。
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
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,可是只支持往后添加和删除元素,
哎,无奈!
原文:https://www.cnblogs.com/kangdong/p/8831242.html