
謎解き: 最大効率での作業割り当て
シナリオ
あなたは、とある村の暮らしを楽にする魔法使いです。 村人たちは毎日仕事で疲れ切っている為、効率的に仕事をすることを望んでいます。 以下のルールに基づき、最適に作業を割り当てるプログラムを完成させて一番少ない時間で作業が完了する時間を計算してください。ルール
- 村には n 人の村人がいます。
- タスクごとにかかる時間が異なります(配列 tasks で与えられます)。
- 村人たちは協力して、すべてのタスクを完了させる必要があります。
- あなたの目標は、作業する村人全員が最も短い時間で作業完了させることです。
条件
- 各タスクは1人の村人にしか割り当てられません。
- タスクの順序を変更しても構いません。
- 最も作業時間の短い時間数を算出してください。
入力例
- tasks (配列): 各タスクにかかる時間(例: [3, 2, 8, 7, 5, 1])。
- workers (整数): 作業する村人の数(例: 3)。
const tasks = [3, 2, 8, 7, 5, 1]
const workers = 3
出力例
最も作業時間が長い村人の負担が最小化された場合の作業時間。console.log(assignTasks(tasks, workers)) // 出力例: 10
この問題で学べるポイント
- グリーディアルゴリズムの考え方 - 各ステップで最善の選択を行い、全体の最適解を目指します。
- 配列操作のスキル - 配列の並び替え、値の更新、最小値・最大値の計算。
- 効率性への配慮 - 無駄な計算を減らすことでスケーラブルなソリューションを考える。
解答プログラミングを打ち込む
※ assignTasks()関数を完成させてください。ヒント
- タスクを「大きい順」に並べて、最小負担の村人に順番に割り当てることで効率が良くなります。
- 最大負担の最小化を目指すために、負担の計算を都度更新します。
解答サンプル
回答
function decodeMessage(tasks, workers) {
// タスクを降順に並び替え(大きいものから割り当てる)
tasks.sort((a, b) => b - a)
// 各村人の作業時間を保持する配列
let workerLoads = Array(workers).fill(0)
// タスクを順番に村人に割り当て
for (let task of tasks) {
// 現在の負担が最も軽い村人にタスクを割り当て
let minIndex = workerLoads.indexOf(Math.min(...workerLoads))
workerLoads[minIndex] += task
console.log(minIndex,task)
}
// 最大負担を返す
const max_worker_time = Math.max(...workerLoads)
return max_worker_time
}
解説
...+変数は、スプレッド構文(またはレスト構文)と言って、簡単に説明すると、階層を1階層上げてくれる指定処理です。 複数の変数をマージしたりする時に便利に使えます。
0 件のコメント:
コメントを投稿