Gym 100917H H - Hierarchy(map)

题目大意:
给你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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值