function cal($jobs, $persons) {
// 将任务转换为包含id和时间的数组,并按时间降序排序
$sortedJobs = [];
foreach ($jobs as $id => $time) {
$sortedJobs[] = ['id' => $id, 'time' => $time];
}
usort($sortedJobs, function ($a, $b) {
return $b['time'] - $a['time'];
});
// 初始化员工数据
$personData = [];
foreach ($persons as $person) {
$personData[$person] = [
'total' => 0,
'jobs' => []
];
}
// 分配任务给员工(贪心算法)
foreach ($sortedJobs as $job) {
// 找到当前总工时最少的员工
$minTotal = PHP_INT_MAX;
$selectedPerson = null;
foreach ($personData as $person => $data) {
if ($data['total'] < $minTotal) {
$minTotal = $data['total'];
$selectedPerson = $person;
}
}
// 分配任务
$personData[$selectedPerson]['total'] += $job['time'];
$personData[$selectedPerson]['jobs'][] = $job;
}
// 将任务分配到天数(每天最多5小时)
$result = [];
foreach ($personData as $person => $data) {
$jobsList = $data['jobs'];
// 按任务耗时降序排序以优化天数分配
usort($jobsList, function ($a, $b) {
return $b['time'] - $a['time'];
});
$days = [];
$currentDay = 1;
$currentDayTime = 0;
$currentJobs = [];
foreach ($jobsList as $job) {
$time = $job['time'];
if ($currentDayTime + $time <= 5) {
$currentDayTime += $time;
$currentJobs[] = $job['id'];
} else {
$days[] = [
'day' => '第' . $currentDay . '天',
'jobs_id' => $currentJobs
];
$currentDay++;
$currentDayTime = $time;
$currentJobs = [$job['id']];
}
}
if (!empty($currentJobs)) {
$days[] = [
'day' => '第' . $currentDay . '天',
'jobs_id' => $currentJobs
];
}
$result[$person] = $days;
}
return $result;
}
$jobs = [ // 工作key => 工时
"1423" => 1,
"1424" => 1,
"1501" => 2,
"1392" => 1,
"1391" => 1,
"1464" => 4,
"1484" => 1,
"1493" => 4,
"1403" => 1,
"1395" => 1,
"1399" => 2,
"1402" => 1,
"1489" => 2,
"1490" => 1,
"1491" => 1,
];
$persons = ["superman", "batman", "heiguafu"];
$result = cal($jobs, $persons);
print_r($result);
//输出结果
λ php cal.php
Array
(
[superman] => Array
(
[0] => Array
(
[day] => 第1天
[jobs_id] => Array
(
[0] => 1464
)
)
[1] => Array
(
[day] => 第2天
[jobs_id] => Array
(
[0] => 1489
[1] => 1484
[2] => 1402
)
)
)
[batman] => Array
(
[0] => Array
(
[day] => 第1天
[jobs_id] => Array
(
[0] => 1493
[1] => 1423
)
)
[1] => Array
(
[day] => 第2天
[jobs_id] => Array
(
[0] => 1392
[1] => 1403
[2] => 1490
)
)
)
[heiguafu] => Array
(
[0] => Array
(
[day] => 第1天
[jobs_id] => Array
(
[0] => 1501
[1] => 1399
[2] => 1424
)
)
[1] => Array
(
[day] => 第2天
[jobs_id] => Array
(
[0] => 1391
[1] => 1395
[2] => 1491
)
)
)
)
一个均匀合理分配工作的算法
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 最近这个项目负责人,当得真是很火大,明明现在项目部就我一个人,我除了完成我自己的工作,还经常是要跑腿打杂啊。 还各...
- 答题思路:意愿类面试题,带人际关系色彩。考察求职动机、人际交往意识与技巧等。