POJ 2259(用空间换取时间)

来源:互联网 发布:淘宝的支付方式 编辑:程序博客网 时间:2024/05/24 04:31

/**/#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();}}}}}}

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

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


原创粉丝点击