Matlab编程练习4

问题

(问题都是来源某牛的题,用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       (合作关系10 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号员工…

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值