map应用-双向队列

12:双向队列

总时间限制:
5000ms
内存限制:
65536kB
描述
新建的 Beijing Institute Group 银行 (BIG-Bank) 在北理工开了一个营业点,他们装备了由 IBM Coral Studio 提供的现代化计算环境,使用现代的信息技术。通常,每个银行客户都有唯一的用来标识身份的正整数 K ,而每当他来到银行寻求服务时,银行都会给他一个正整数 P ,代表他的优先权。银行一个年轻的管理员李凌对软件服务系统的功能十分惊讶。他建议打破银行传统的最低优先权优先的服务方式,加入最高优先权优先的服务。于是,软件系统将得到如下类型的请求:

0 系统终止服务
1 K P 将客户 K 加到等待队列中,并赋优先权 P
2 为有最高优先权的人服务,并将他从等待队列中删除
3 为有最低优先权的人服务,并将他从等待队列中删除
银行的软件工程师张国文现在抽不开身,请你替他写一个程序实现这种服务策略。
输入
输入的每行包含一个可能的请求,只有最后一行是停止请求 ( 代码 0) 。你可以认为每个加入客户的请求 ( 代码 1) 中,赋予的优先权都是不同的。每个标识 K 都是小于 106 的数,优先权 P 都是小于 107 的数,客户可能请求多次服务,每次都会得到不同的优先权。
输出
对每个代码为 2 或 3 的请求,程序必须打印被服务的客户的标识。如果此时队列是空,那么打印 0 。
样例输入
2 
1 20 14 
1 30 3 
2 
1 10 99 
3 
2 
2 
0
样例输出
0 
20 
30 
10 
0

其实这道题,STL里面是有双向队列的容器的好像,但是不用那个也能做出来,而且只能用map,我一开始是用结构体然后快排,发现根本不可行,因为题目中说,客户可能请求多次服务,每次都会得到不同的优先权。如果用结构体存,还要去找这个数,麻烦,直接map就好了。这里也普及一下map的一些操作

map的定义一般是mapm,mapm,mapm,这些都是可行的,还有什么int指向double那些都可以,int指向一个结构体也是可以的,只要是两种已经声明了的类型就行。后面那个m就是他的名字,接下来就是给里面赋值了,对于mapm,可以写m[1]=2;m[-100]=7;类似于数组,不过他可以是负数,而且是你要这样定义了他才会存在,否则不分配空间,这也是跟数组的一个区别。对于mapm,则可以m[10000]='a'或者mapm,m['c']=66666;string那种就要用双引号了“”。

map很多操作要用到迭代器,声明为,map::iterator it;

                                              说白了就是个指针,用的时候要和map的类型对应

一些map的常用函数

it=m.find('a')查找map里面是否有'a',这个a是map,只能查找第一个变量类型,返回他所在位置的指针,找不到就会为m.end()

it=m.begin(),map的开头,返回地址

it=m.end(),map的结尾,这个end是不指向元素的,相当于for(i

m.sizeof(),得到map里面有多少个元素

m.erase()    删除某个元素,m.erase(m.begin()),删除第一个

还有一点就是map自动按升序排序的,所以是不能快排的,例如他的顺序是m[-100],m[0],m[100]

这道题目很简单,代码如下:

#include
#include
using namespace std;
int main()
{
	int cho,a,b; 
	mapm;
	map::iterator it;
	while(scanf("%d",&cho),cho!=0)
	{
		if(cho==1)
		{
			scanf("%d%d",&a,&b);
			m[b]=a;
		}
		else if(cho==2)
		{
			it=m.end();
			it--;
			if(m.size()!=0)
			{
				printf("%d\n",*it);
				m.erase(m.end());
			}
			else
				printf("0\n");
		}
		else
		{
			it=m.begin();
			if(m.size()!=0)
			{
				printf("%d\n",*it);
				m.erase(m.begin());
			}
			else
				printf("0\n");
		}
	}
}



你可能感兴趣的:(CCCC团体天梯赛,openjudge练习题)