南邮 OJ 1854 B. Give you a Bag

B. Give you a Bag

时间限制(普通/Java) :  2000 MS/ 6000 MS          运行内存限制 : 32767 KByte
总提交 : 51            测试通过 : 22 

比赛描述

    有这样一种类似于闭包的数据结构,支持两种操作:
    1 x
    把元素 x 放入 这个包内

    2
    从包内丢弃一个元素

    现在我们给你一个操作带返回值的操作序列,我们需要你猜这个数据结构是什么。
    你有以下选择:
    Stack 栈(先进后出)
    Queue 队列(先进先出)
    Priority-queue 优先权队列( 每次都丢弃最大元素的最大堆 )



输入

    有多组测试用例。每个测试案例开始行包含一个整数N(1 <= N <=1000)。以下N行,每行一个操作。 对于操作一,输入为1 x,x代表将要放入数据结构里面的数,对于操作二,输入2 x,这里的x代表返回值,即执行操作2之后,返回的一个值(例如优先权队列,则返回的是最大值)。x的值始终是一个正整数不大于100。输入到文件尾。输入文件的大小不超过1MB。

输出

    对于每个测试用例,输出下面语句中的其中一个:
    stack:表示判断这一定是一个堆栈。
    queue:表示判断这一定是一个队列。
    priority queue: 表示判断这一定是一个优先级队列。
    impossible: 表示判断它不可能是一个堆栈,队列或优先级队列。
    not sure: 表示判断它可能是以上所说三种数据结构中的多种。

样例输入

6
1 1
1 2
1 3
2 1
2 2
2 3
6
1 1
1 2
1 3
2 3
2 2
2 1
2
1 1
2 2
4
1 2
1 1
2 1
2 2
7
1 2
1 5
1 1
1 3
2 5
1 4
2 4

样例输出

queue
not sure
impossible
stack
priority queue

题目来源

ACM爱好者协会







/* 98MS

#include<iostream>
#include<stack>
#include<queue>
using namespace std;

int main(){
//	freopen("test.txt","r",stdin);
	int n,a,b,count,sum;
	stack<int> si;
	queue<int> qi;
	priority_queue<int> pqi;
	bool stack_flag,queue_flag,pq_flag,ok;
	while(scanf("%d",&n)==1){
		while(si.size()){
			si.pop();
		}
		while(qi.size()){
			qi.pop();
		}
		while(pqi.size()){
			pqi.pop();
		}
		count = 3;
		sum = 0;
		stack_flag = queue_flag = pq_flag = ok = 1;
		while(ok && count && n--){
			scanf("%d%d",&a,&b);
			if(a==1){
				sum++;
				if(stack_flag){
					si.push(b);
				}
				if(queue_flag){
					qi.push(b);
				}
				if(pq_flag){
					pqi.push(b);
				}
			}else{
				ok = 0;
				if(--sum<0){
					count = 0;
					break;
				}
				if(stack_flag){
					if(si.top()==b){
						si.pop();
						ok = 1;
					}else{
						stack_flag = 0;
						count--;
					}
				}
				if(queue_flag){
					if(qi.front()==b){
						qi.pop();
						ok = 1;
					}else{
						queue_flag = 0;
						count--;
					}
				}
				if(pq_flag){
					if(pqi.top()==b){
						pqi.pop();
						ok = 1;
					}else{
						pq_flag = 0;
						count--;
					}
				}
			}
		}
		while(n-->0){
			scanf("%*d%*d");
		}
		if(!ok){
			printf("impossible\n");
		}else if(count>1){
			printf("not sure\n");
		}else if(count==1){
			if(stack_flag){
				printf("stack\n");
			}else if(queue_flag){
				printf("queue\n");
			}else{
				printf("priority queue\n");
			}
		}else{
			printf("impossible\n");
		}
	}
}
*/



#include<iostream>
#include<stack>
#include<queue>
using namespace std;

int getNum(){
	int t,r;
	while((t=getchar())<'0' || t>'9');
	r = t-'0';
	while((t=getchar())>='0' && t<='9'){
		r = r*10 +t-'0';
	}
	return r;
}

int main(){
//	freopen("test.txt","r",stdin);
	int n,a,b,count,sum;
	stack<int> si;
	queue<int> qi;
	priority_queue<int> pqi;
	bool stack_flag,queue_flag,pq_flag,ok;
	while(scanf("%d",&n)==1){
		while(si.size()){
			si.pop();
		}
		while(qi.size()){
			qi.pop();
		}
		while(pqi.size()){
			pqi.pop();
		}
		count = 3;
		sum = 0;
		stack_flag = queue_flag = pq_flag = ok = 1;
		while(ok && count && n--){
//			scanf("%d%d",&a,&b);
			a = getNum();
			b = getNum();
			if(a==1){
				sum++;
				if(stack_flag){
					si.push(b);
				}
				if(queue_flag){
					qi.push(b);
				}
				if(pq_flag){
					pqi.push(b);
				}
			}else{
				ok = 0;
				if(--sum<0){
					count = 0;
					break;
				}
				if(stack_flag){
					if(si.top()==b){
						si.pop();
						ok = 1;
					}else{
						stack_flag = 0;
						count--;
					}
				}
				if(queue_flag){
					if(qi.front()==b){
						qi.pop();
						ok = 1;
					}else{
						queue_flag = 0;
						count--;
					}
				}
				if(pq_flag){
					if(pqi.top()==b){
						pqi.pop();
						ok = 1;
					}else{
						pq_flag = 0;
						count--;
					}
				}
			}
		}
		while(n-->0){
			scanf("%*d%*d");
		}
		if(!ok){
			printf("impossible\n");
		}else if(count>1){
			printf("not sure\n");
		}else if(count==1){
			if(stack_flag){
				printf("stack\n");
			}else if(queue_flag){
				printf("queue\n");
			}else{
				printf("priority queue\n");
			}
		}else{
			printf("impossible\n");
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值