POJ 2259(用空间换取时间)

/*
*/
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
queue<int>  teamid[1001];
queue<int>  normal;
int flagNum[1000000+1]; //关键在于这里,一个数的状态,看这个,如果是0,那么不是队列中的,是其他数,就是几号队列的 ;数就带过来了; 
int flagTeam[1001];

void init(int n){
	while(normal.size()!=0) normal.pop();
	for(int i = 0; i < n; ++i){
		flagTeam[i] = 0;
		while(teamid[i].size() ) teamid[i].pop();
	}
}
int main(){
	int counter = 0;
	int n,m,num;
	while(1){
		scanf("%d",&n);
		if(n == 0) return 0;
		init(n);
		memset(flagNum, 0, sizeof(int)*1000000+1);
		for(int i = 1; i <= n; ++i){
			scanf("%d",&m);
			for(int j = 0; j < m; ++j){
				scanf("%d",&num);
				flagNum[num] = i;				
			}
		}
		printf("Scenario #%d\n",++counter);  
		char str[20];		
		while(1){
			scanf("%s",str);
			if(strcmp(str,"STOP") == 0) {printf("\n");break;}
			if(strcmp(str,"ENQUEUE") == 0){
				scanf("%d",&num);
				if(flagNum[num] == 0){
					normal.push(num);
				}else{
					if(flagTeam[flagNum[num]] == 0){
						teamid[flagNum[num]].push(num);
						normal.push(-flagNum[num]);
						flagTeam[flagNum[num]] = 1;
					}else{
						teamid[flagNum[num]].push(num);
					}
				}
			}
			else if(strcmp(str,"DEQUEUE") == 0){
				if(normal.size() == 0) continue;
				if( normal.front() > 0){								
					printf("%d\n",normal.front());
					normal.pop();
				}else{					
					printf("%d\n",teamid[ -normal.front() ].front() );
					teamid[ -normal.front() ].pop();
					if(teamid[ -normal.front() ].size() == 0){
						flagTeam[-normal.front()] = 0;
						normal.pop();
					}
					
				}
			}
		}
	}
}

这题的难点在于计算速度;(因为数据量大)

解决这题的关键在于:  要用空间换取时间;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值