书中代码思路:
用map<int, int>
来存储“人-团队”的对应关系
用queue<int> q
来存储当前队列中的团队号
用queue<int> q2[1000]
来存储1000个团队各自形成的队列
当插入时,通过map<int, int>
找到团队号,然后插入到q2[团队号]
这个队列中,如果这个队列插入前为空,那么还要把这个团队号插入到q
中
当删除时,从q
中获取当前队列中的第一个团队号,再把q2[团队号]
中的第一个元素删除,如果这个队列删除后为空,那么把q
中的第一个团队号也删除
自己想的思路:
用map<int, int>
来存储“人-团队”的对应关系
用vector<queue<int>> tqueue
来存储队列,其中vector的每个分量是一个队列,每个队列代表一个团队
当插入时,通过map<int, int>
找到团队号,然后遍历这个vector,如果找到这个团队,就push到队列末尾,如果没找到,则建立一个新队列,放在vector最后面
当删除时,把tqueue[0]
这个队列中的第一个元素删除,如果这个队列删除后为空,就用tqueue.erase()
把vector的第一个分量删除
对比:
书中多用了一个队列,用来存团队号,这个队列最多有1000个元素,不是很占地方,但却非常省时间
自己写的代码用了vector,最大也有1000个分量,插入时有可能需要整个遍历一遍,删除时也有可能要挪动整个vector,非常费时(虽然也能AC)
#include <iostream>
#include <map>
#include <vector>
#include <queue>
using namespace std;
int main()
{
//freopen("C:\\Users\\Summer\\Desktop\\input.txt", "r", stdin);
//freopen("C:\\Users\\Summer\\Desktop\\output.txt", "w", stdout);
int t;
int num_s;
int x;
string command;
map<int, int> ele2set;
vector<queue<int>> tqueue;
int num_test = 1;
while(cin>>t && t) {
ele2set.clear();
tqueue.clear();
//输入集合
for(int i=0; i<t; i++) {
cin>>num_s;
for(int j=0; j<num_s; j++) {
cin>>x;
ele2set[x] = i;
}
}
cout<<"Scenario #"<<num_test++<<endl;
//输入commands
while(cin>>command && (command[0] != 'S')) {
if(command[0] == 'E') {
cin>>x;
int i;
for(i=0; i<tqueue.size(); i++) {
if(ele2set[tqueue[i].front()] == ele2set[x]) {
tqueue[i].push(x);
break;
}
}
if(i == tqueue.size()) {
queue<int> q;
q.push(x);
tqueue.push_back(q);
}
}
else {
cout<<tqueue[0].front()<<endl;
tqueue[0].pop();
if(tqueue[0].empty())
tqueue.erase(tqueue.begin(), tqueue.begin()+1);
}
}
//输出
cout<<endl;
}
return 0;
}