Hoj 1456 Team Queue

这篇博客介绍了Hoj 1456编程题目的解决方案,主要探讨如何使用链表来模拟团队队列,通过STL list实现详细操作。
摘要由CSDN通过智能技术生成

题目连接:http://acm.hit.edu.cn/hoj/problem/view?id=1456

团队队列。

方法一:直接用链表模拟,用STL list直接模拟。


#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <queue>
#include <list>
#include <algorithm>
using namespace std;

int team[1000005];

int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    int t;
    int cas = 0;
    char cmd[20];
    list<int> q;
    list<int> final;
    list<int>::iterator last[1005];
    while(scanf(" %d",&t)!=EOF && t!=0)
    {
        q.clear();
        final.clear();
        cas++;
        int num,t1;

        for(int i=1; i<=t; i++)
        {
            scanf(" %d",&num);
            for(int j=0; j<num; j++)
            {
                scanf(" %d",&t1);
                team[t1] = i;
            }
        }

        for(int i=1; i<=t; i++) last[i] = q.end();

        printf("Scenario #%d\n",cas);

        while(scanf(" %s",cmd)!=EOF && strcmp(cmd,"STOP")!=0)
        {
            if(strcmp(cmd,"ENQUEUE") == 0)
            {
                int w;
                scanf("%d",&w);
                if(last[team[w]]==q.end())
                    last[team[w]]=final.insert(final.end(),w);
                else
                {
                    last[team[w]]++;
                    last[team[w]]=final.insert(last[team[w]],w);
                }
            }
            else if(strcmp(cmd,"DEQUEUE") == 0)
            {
                int temp = final.front();
                printf("%d\n",temp);
                list<int>::iterator ti = final.begin();
                if(ti == last[team[temp]])
                    last[team[temp]] = q.end();
                final.pop_front();
            }
        }
        printf("\n");
    }
    return 0;
}

方法二:开1000个小队列,一个大队列模拟。

#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

int v[1000100];
bool flag[1010];
queue <int> q,cyr[1010];

int main()
{
  int T,n,x,i,j,temp,u;
  char e[50];
  scanf("%d",&T);
  temp=0;
  while (T!=0)
  {
    temp++;
    memset(v,0,sizeof(v));
    memset(flag,true,sizeof(flag));
    printf("Scenario #%d\n",temp);
    while (!q.empty())
      q.pop();
    for (i=1;i<=T;i++)
    {
      scanf("%d",&n);
      for (j=1;j<=n;j++)
      {
        scanf("%d",&x);
        v[x]=i;
      }
    }
    scanf("%s",e);
    while (e[0]!='S')
    {
      if (e[0]=='E') 
      {
        scanf("%d",&x);
        u=v[x];
        cyr[u].push(x);
        if (flag[u])
        {
          flag[u]=false;
          q.push(u);
        }
      }
      if (e[0]=='D')
      {
        u=q.front();
        while (cyr[u].empty()) 
        {
          flag[u]=true;
          q.pop(); 
          u=q.front();
        }
        x=cyr[u].front();
        cyr[u].pop();
        printf("%d\n",x);
      }
      scanf("%s",e);
    }
    for (i=1;i<=n;i++)
      while (!cyr[i].empty()) cyr[i].pop();
    printf("\n");
    scanf("%d",&T);
  }
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值