例题5-6 团体队列 UVa540

算法竞赛入门经典(第2版) 第5C++与STL入门

题5-6 团体队列  UVa540

感悟。

1、从网站下载英文原题,重点在看输入输出数据与格式。

2、因队列内容比较熟悉,英文很快看懂,输入输出也没问题。

3、有一个担忧,就是数据量比较大,冒泡排序的查询方式是否会超时。

4、程序想想挺简单,但编起来肯性会有许多细节问题。

5、通过http://blog.csdn.net/chao_xun/article/details/8037438简单学习了queue.

6、瞟了一眼书中中文,发现题意理解有误。If yes, it enters the queue right behind them. If not, it enters the queue at the tail and becomesthe new last element (bad luck).这个新人会插队到最后一个队友的身后。如果没有任何一个队友排队,他会排到长队的队尾。

7、开辟一个团队队列,开辟一个队列数组。

8、经过一番艰苦的调试,样例通过,在http://vjudge.net第一次提交AC,在https://uva.onlinejudge.org提交AC,看看时间此时2016-11-17 20:45

9、又可以放心的看书中代码了。发现书中将队列用作局部变量,就无需每次清空了。本人思路已与书中代码接近。

附上AC代码,编译环境Dev-C++4.9.9.2

#include <iostream>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>

using namespace std;

queue<int> q[1000+10];
queue<int> team;
vector<int> vec;
int e[1000+10][1000+10];
int n[1000+10];
int t;
int front;//vector中 front位置

void enqueue(){//入队
    int element;
    int i,j,k;
    int flag=0;
    cin>>element;
    for(i=0;i<t;i++){
        for(j=0;j<n[i];j++)
            if(element==e[i][j]){//查询所在队列
                for(k=front;k<vec.size();k++){
                    if(vec[k]==i)
                        break;
                }
                if(k==vec.size()){//团队数组不存在该队
                    vec.push_back(i);//在团队数组中添加该队
                    team.push(i);
                    q[i].push(element);//在该队中添加元素
                }else//存在该队
                    q[i].push(element);//在该队中添加元素
                //printf("i=%d element=%d\n",i,element);
                flag=1;
                break;
            }
        if(flag)
            break;
    }                
}

void dequeue(){//出队
    int element;
    int i;
    i=team.front();
    element=q[i].front();
    q[i].pop();
    //printf("i=%d\n",i);
    if(q[i].size()==0){//该队列已空
        team.pop();//将该队列从团队中清除。
        front++;//vector右移一个位置.
    }
    cout<<element<<endl;
}
int main(){
    int i,j;
    string cmd;
    int kase=0;
    while(cin>>t&&t){
        front=0;
        vec.clear();//清空数组
        while(team.size())//清空团队队列
            team.pop();
        for(i=0;i<1000+10;i++)//清空队列
            while(q[i].size())
                q[i].pop();
        kase++;
        cout<<"Scenario #"<<kase<<endl;
        for(i=0;i<t;i++){
            cin>>n[i];
            for(j=0;j<n[i];j++){
                cin>>e[i][j];
            }
        }
        
        while(1){
            cin>>cmd;
            if(cmd[0]=='S')
                break;
            if(cmd[0]=='E'){
                enqueue();
            }else if(cmd[0]=='D'){
                dequeue();
            }
        }
        cout<<endl;
    }
    return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值