zoukankan      html  css  js  c++  java
  • 给专家分配作品

    引言: 前些天项目里遇见一个需求, 给专家分配作品, 觉得还蛮有趣, 感兴趣的同学可以读下去, 阅读此文大概需要...(我也不知道几分钟...

    1: 见图

    这个需求是这样子的, 要给选中的专家分配作品, 有两种情况,

    1: 每位专家部分作品, 也就是均分, 如果作品均分完还有余数, 则再继续分, 直至分完结束.

    2: 每位专家评审所有作品, 也就是所有作品都会被每位专家评审.

    因为存在一对多及多对多的关系, 首先要先建张表, 表里有三个字段, 主键id, 作品id, 专家id,  如下:

    ok, 建好数据表之后我们暂时先看其中一种 "每位专家部分作品" ,

    做这个每位专家部分作品前, 先来看以下代码,   "给老师分书":

        public function expertDistributionAction()
        {
            $book = [1,2,3,4,5,6,7,8,9,10,11,12,13,14];     //14本书
            $doc = 4;   //4个老师
            $arr = [];
            $z = (int)(count($book)/$doc);      //整数 3
            $y = count($book)%$doc;             //余数 2
            $un = [];
    
            //分配整数, 循环老师
            for ($i = 0 ; $i < $doc; $i++){
    
                for($j = 0; $j < $z ; $j++){
                    $arr[$i]['book'][] = $book[$j];
                    //把已经分配的数放入$un数组里
                    array_push($un,$j);     //$un = [0,1,2];
                }
    
                //把已经分配的给unset掉
                for($d = 0; $d < count($un) ; $d++){
                    unset($book[$un[$d]]);
                }
    
                //重建索引
                $book = array_values($book);            //$book = [4,5,---14]
            }
    
            //余数分配, 即每人一本
            for($i = 0; $i < $y ; $i++){        //$y = 2;
                $arr[$i]['book'][] = $book[$i];
            }
    
            return $arr;
        }

    上面的注释已经写的蛮清楚, 这个分书的算法要注意的是以下几点:

    1: 第一层是循环老师人数, 这个很关键

    2: 分配完的书需要在数组里去掉

    3: 去掉分配完的书后数组 "重建索引", 分完一个老师重建一次

    了解分书的逻辑后就开始代码了    (未完待续...

  • 相关阅读:
    547. Friend Circles
    399. Evaluate Division
    684. Redundant Connection
    327. Count of Range Sum
    LeetCode 130 被围绕的区域
    LeetCode 696 计数二进制子串
    LeetCode 116 填充每个节点的下一个右侧节点
    LeetCode 101 对称二叉树
    LeetCode 111 二叉树最小深度
    LeetCode 59 螺旋矩阵II
  • 原文地址:https://www.cnblogs.com/cyfm/p/7551125.html
Copyright © 2011-2022 走看看