1 条题解

  • 0
    @ 2025-5-11 22:54:13

    问题理解

    我们需要模拟一个组织的员工层级结构,支持以下操作:

    雇佣(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
    上传者