题意:
1.表示插入客户K,他的优先级是P(相当于大小)
2.表示输出当前优先级最高的客户(即找出最大值),并且删除。
3.输出最低级的并删除。
最开始思路,直接用map写,然而超时了:
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
int main()
{
map <int,int> client;
map <int,int>::iterator it;
map <int,int>::iterator ret;
int n,k,p,max,min;
while(scanf("%d", &n)&&(n != 0))
{
if(n==1)
{
scanf("%d%d", &k, &p);
client[k]=p;
}
else if(n==2)
{
max=0;
ret=client.begin();
for(it=client.begin();it!=client.end();++it)
{
if(it->second>max)
{
max=it->second;
ret=it;
}
}
if(ret!=client.end())
{
cout<<ret->first<<endl;
client.erase(ret);
}
else
cout<<"0"<<endl;
}
else if(n==3)
{
min=10000000;
ret=client.begin();
for(it=client.begin();it!=client.end();++it)
{
if(it->second<min)
{
min=it->second;
ret=it;
}
}
if(ret!=client.end())
{
cout<<ret->first<<endl;
client.erase(ret);
}
else
cout<<"0"<<endl;
}
}
return 0;
}
技巧:添加顾客时储存为client[p]=k(即将优先级作为第一个数储存)
这样的话可以利用map的自动排序(map按first的值从小到大存储),优先权最高的即为map中最后一个,
优先级最低的为map中第一个,不用在循环找最大最小值,提高速度
然而,用了这个技巧后依然超时。。。在尝试了无数次后发现将cin改为scanf就AC了。
原来是因为scanf和printf的读取速度比cin和cout要快
AC代码1:
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
int main()
{
map <int,int> client;//用来储存顾客优先级,first为优先级,second为顾客ID
map <int,int>::iterator it;//声明迭代器
int n,k,p;
while(scanf("%d", &n)&&(n != 0))//用scanf读入
{
if(n==1)
{
scanf("%d%d", &k, &p);//用scanf读入
client[p]=k;//first为优先级,second为顾客ID,利用map自动排序
}
else if(n==2)
{
if(client.size()==0)//map中无顾客信息
cout<<"0"<<endl;
else
{
it=client.end();
it--;//迭代器指向map中最后一个元素
cout<<it->second<<endl;
client.erase(it);//删除it所指的元素
}
}
else if(n==3)
{
if(client.size()==0)
cout<<"0"<<endl;
else
{
it=client.begin();//迭代器指向map中第一个元素
cout<<it->second<<endl;
client.erase(it);
}
}
}
return 0;
}
AC代码2:
(面向对象,规范写法)
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
class DoubleQueue
{
private:
map <int,int> client;
int num;
public:
void initial()
{
client.clear();
}
void addClient(int k,int p)
{
client[p]=k;
}
void serveHighest()
{
if(client.size()==0)
num=0;
else
{
num=(*client.rbegin()).second;
client.erase(--client.end());
}
}
void serveLowest()
{
if(client.size()==0)
num=0;
else
{
num=(*client.begin()).second;
client.erase(client.begin());
}
}
void printClient()
{
cout<<num<<endl;
}
};
int main(){
int n, k, p;
DoubleQueue dq;
dq.initial();
while(scanf("%d", &n)&&(n != 0))
{
if(n== 1)
{
scanf("%d%d", &k, &p);
dq.addClient(k, p);
}
else if(n == 2)
{
dq.serveHighest();
dq.printClient();
}
else if(n == 3)
{
dq.serveLowest();
dq.printClient();
}
}
return 0;
}