问题
(问题都是来源某牛的题,用matlab编程实现)
A公司和B公司有n个合作的子项目,每个子项目由A公司和B公司各一名员工参与。一名员工可以参与多个子项目。
一个员工如果担任了该项目的项目经理,它需要对所参与的该项目负责。一个员工也可以负责多个项目。
A公司和B公司需要保证所有子项目都能有人负责,问最少需要指定几名项目经理?
输入例子
输入描述:
第一行为A公司的的人员id列表, 0< id数量 < 10000,用空格切分
第二行为B公司的人员id列表, 0< id数量 < 10000,用空格切分
下面有n行,每一行为每个子项目的合作对应关系,为两个id,第一个为A公司的员工id,第二个为B公司的员工id,用空格区分
0 1 2 (A公司员工ID)
3 4 5 (B公司员工ID)
0 4 (合作关系1)
0 3 (合作关系2)
1 3 .
1 4 .
2 5
2 4 (合作关系n)
输出例子
3 (即最小指派3名员工)
例子说明
可行的一个保留人员方案是留下0,1,2即可,这样即可保证所有的子项目都有人cover到。
解题思路
这里比较好实现的其实是对员工实行过劳死策略,即先统计每个员工负责的项目量,按项目量从大到小选定项目负责人,即在上面输入用例中,4号员工负责3个项目(项目量最高),因此优先选择4号员工为那3个项目的项目负责人(以保证最大程度上减少项目负责人的人数)…以此类推…
Matlab代码实现
A=[0 1 2]; %A公司员工ID
B=[3 4 5]; %B公司员工ID
P=[0 4;0 3;1 3;1 4;2 5;2 4];
%% 先合并所有员工ID
C=[A,B];
record=zeros(1,size(C,2)); %record记录每个员工负责的项目数量
%% 统计各个员工参与的项目数量
for i=1:size(P,1)
for j=1:2
for k=1:size(C,2)
if P(i,j)==C(k)
record(k)=record(k)+1;
break;
end
end
end
end
%% 由员工项目量从大到小选定负责人(保证用最小的员工数量)
Mre=zeros(1,size(C,2)); %Mre记录每个项目是否已经选定负责人,初始化为0,有负责人则指定为1
PP=zeros(1,size(C,2)); %PP记录当前项目的员工项目数量是否有被更新过
while(sum(Mre)~=size(C,2)) %还有项目没有负责人
[maxN,index]=max(record); %指派项目最多员工作为那些项目的负责人
record(index)=-1; %已经指派
for i=1:size(P,1) %遍历所有项目
for j=1:2 %遍历当前项目所有参与员工(两个)
if P(i,j)==C(index) && Mre(i)~=1
Mre(i)=1;
break;
end
end
for k=1:size(C,2) %遍历所有员工
if PP(i)~=1 && Mre(i)==1 && C(k)~=C(index) && (C(k)==P(i,1) || C(k)==P(i,2)) %已经选定项目负责人,而且没有更新过P(i,:)
record(k)=record(k)-1;
PP(i)=1;
end
end
end
end
count=0;
for i=1:size(record,2)
if record(i)==-1 %被指派
count=count+1;
disp(C(i)); %被指派员工ID
end
end
总结
愧对4号员工…