【刘汝佳书】例题5-6 UVA540 (queue、map的练习)

书中代码思路:
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;
}

猜你喜欢

转载自blog.csdn.net/qq_41727666/article/details/89026448