1 条题解
-
0
问题理解
我们需要模拟一个组织的员工层级结构,支持以下操作:
雇佣(hire):一个现有成员雇佣一个新成员,新成员的优先级最低(即放在直接下属列表的末尾)。 解雇(fire):解雇一个现有成员,如果该成员有下属,则其优先级最高的下属会晋升到该成员的位置,并继承其优先级。晋升过程会级联,直到某个没有下属的成员被晋升。 打印(print):以树形结构打印当前的组织层级,每个层级的成员名称前有对应数量的 '+' 符号表示层级深度。
解决思路
数据结构选择: 使用树结构来表示组织层级,每个节点(成员)包含其直接下属的列表。 使用 map 来快速查找成员节点。 雇佣操作: 创建新成员节点,将其添加到雇佣者的直接下属列表的末尾。 解雇操作: 找到要解雇的成员节点。 如果该成员有下属,找到其优先级最高的下属(即直接下属列表的第一个成员),将该下属晋升到当前成员的位置,并继承其优先级。 递归处理晋升后的成员,直到某个没有下属的成员被晋升。 删除原成员节点。 打印操作: 递归打印树结构,根据层级深度添加 '+' 符号。
代码实现
#include<iostream> #include<cstring> #include<map> #include<list> using namespace std; struct node{ string name; node *f; list<node*> kid; node() {f=NULL;} }; map<string,node*> member; void hire(string a,string b){ node *root=new node(); root->name=b; root->f=member[a]; member[b]=root; member[a]->kid.push_back(root); } void fire(string a){ node* squid=member[a]; member.erase(squid->name); while(!squid->kid.empty()){ squid->name=squid->kid.front()->name; member[squid->name]=squid; squid=squid->kid.front(); } node *root=squid->f; root->kid.remove(squid); delete squid; } void prin(node* root,int dep){ if(root==NULL) return; for(int i=0;i<dep;i++) cout<<'+'; cout<<root->name<<endl; for(list<node*>::iterator it=root->kid.begin();it!=root->kid.end();it++) prin(*it,dep+1); } int main(){ node *root=new node; string a,b,c; cin>>a; root->name=a; member[a]=root; while(cin>>a){ if(a=="print"){ prin(root,0); for(int i=0;i<60;i++) cout<<'-'; cout<<endl; } else if(a=="fire"){ cin>>b; fire(b); } else{ cin>>b>>c; hire(a,c); } } return 0; }
- 1
信息
- ID
- 1004
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者