function cal($jobs, $persons) {
// 將任務(wù)轉(zhuǎn)換為包含id和時(shí)間的數(shù)組,并按時(shí)間降序排序
$sortedJobs = [];
foreach ($jobs as $id => $time) {
$sortedJobs[] = ['id' => $id, 'time' => $time];
}
usort($sortedJobs, function ($a, $b) {
return $b['time'] - $a['time'];
});
// 初始化員工數(shù)據(jù)
$personData = [];
foreach ($persons as $person) {
$personData[$person] = [
'total' => 0,
'jobs' => []
];
}
// 分配任務(wù)給員工(貪心算法)
foreach ($sortedJobs as $job) {
// 找到當(dāng)前總工時(shí)最少的員工
$minTotal = PHP_INT_MAX;
$selectedPerson = null;
foreach ($personData as $person => $data) {
if ($data['total'] < $minTotal) {
$minTotal = $data['total'];
$selectedPerson = $person;
}
}
// 分配任務(wù)
$personData[$selectedPerson]['total'] += $job['time'];
$personData[$selectedPerson]['jobs'][] = $job;
}
// 將任務(wù)分配到天數(shù)(每天最多5小時(shí))
$result = [];
foreach ($personData as $person => $data) {
$jobsList = $data['jobs'];
// 按任務(wù)耗時(shí)降序排序以優(yōu)化天數(shù)分配
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 => 工時(shí)
"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);
//輸出結(jié)果
λ 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
)
)
)
)
一個(gè)均勻合理分配工作的算法
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 日常工作中我們都會(huì)遇到工作分配的問題,小到安排自己的工作先后,大到給團(tuán)隊(duì)下達(dá)任務(wù)。 今天又突然接到臨時(shí)緊急任務(wù),周...
- 最近這個(gè)項(xiàng)目負(fù)責(zé)人,當(dāng)?shù)谜媸呛芑鸫?,明明現(xiàn)在項(xiàng)目部就我一個(gè)人,我除了完成我自己的工作,還經(jīng)常是要跑腿打雜啊。 還各...
- 人在職場(chǎng),每天都有可能遇到各種突發(fā)情況,比如有時(shí)候手里的工作還沒完成,新的任務(wù)就來插一腳了。對(duì)此,大部分人很容易陷...
- 人在職場(chǎng),每天都有可能遇到各種突發(fā)情況,比如有時(shí)候手里的工作還沒完成,新的任務(wù)就來插一腳了。對(duì)此,大部分人很容易陷...
- 答題思路:意愿類面試題,帶人際關(guān)系色彩??疾烨舐殑?dòng)機(jī)、人際交往意識(shí)與技巧等。