题目大意:
给你t个操作
当操作为1时输入员工要进入的部门id,名字与生日
当操作为-1的时候输入部门id,员工id,删除对应部门的员工
每次操作输出包括所有部门中年龄最大的员工,如果年龄一样大就按部门id大小输出,还一样就按员工id大小输出
还有输出当前操作部门的最大的员工名字,年龄一样大就按员工id输出
思路:
用stl模拟
看了几个代码感觉师兄们用map写的代码是最好的
用set的话要自己写重载运算符感觉会麻烦一点
输出的时候因为map遍历输出的时候是按下标排序输出的
用两个map
一个是包括所有部门的,按{年龄,{部门,员工id}}作为下标
一个是建个二维数组每个部门,按{年龄,员工id}作为下标
接下来模拟就完事了
AC代码:
#include <bits/stdc++.h>
using namespace std;
map<int,int>mp;
map<pair<int,pair<int,int>>,string>q;
map<pair<int,int>,int>ma;
map<int,map<pair<int,int>,string>>mm;//建二维map方法是map<int,map<int,int>>
int main()
{
int t;
cin>>t;
while(t--){
int op;
cin>>op;
int d;//部门编号
string s;//员工名字
string ans1,ans2;
int id;
if(op==1){
cin>>d;
cin>>s;
int a,b,c;
scanf("%d:%d:%d",&a,&b,&c);
int num=c*10000+b*100+a;//年龄
int id=++mp[d];
q[{num,{d,id}}]=s;//找所有人最小按先年龄,再部门编号,再员工id来排
ma[{d,id}]=num;
mm[d][{num,id}]=s;
ans1=q.begin()->second;//second这里要用指针
ans2=mm[d].begin()->second;
}else{
cin>>d>>id;
int num=ma[{d,id}];
if(q.count({num,{d,id}}))q.erase({num,{d,id}});//有就删除
if(mm[d].count({num,id}))mm[d].erase({num,id});
if(q.size())
ans1=q.begin()->second;
else ans1="Vacant";
if(mm[d].size())ans2=mm[d].begin()->second;
else ans2="Vacant";
}
cout<<ans1<<' '<<ans2<<endl;
}
return 0;
}