説明
与えられた n
書籍や各書籍は、ページの同じ番号を持っています。あります k
これらの本をコピーする人がと i-th
人が必要とする times[i]
本をコピーする分。
一人一人が、書籍の任意の数をコピーすることができ、彼らは同時にコピーを開始します。仕事が早い時点で終了することができるように割り当てブックへの最善の戦略は何ですか?
最短時間を返します。
例
例1:
Input: n = 4, times = [3, 2, 4]
Output: 4
Explanation:
First person spends 3 minutes to copy 1 book.
Second person spends 4 minutes to copy 2 books.
Third person spends 4 minutes to copy 1 book.
例2:
Input: n = 4, times = [3, 2, 4, 5]
Output: 4
Explanation: Use the same strategy as example 1 and the forth person does nothing.
思路:
あなたは質問の頭を解決するために半分または動的プログラミングを使用することができます。しかし、その答えの半分以上を推奨文言は、それがより多くのスペースを節約するアイデアは簡単にコーディング、シンプルです。
想定時間制限のために tm
、私たちは、この貪欲判断する考えを使用することができます k
コピー完了できる個人を n
本タスクのを:誰もが時間内にできるだけ多くの条項をコピーして、コピーの総数は、彼らがより小さくないかを決定する n
ことができます。
そして期限 tm
とタスク(0または1)は、これら二つの量の間の単調な関係を有する可能性は、することが可能である tm
最小値を見つけるためにバイナリサーチを実行する tm
タスクを達成することができるように、。
パブリッククラスソリューション{ / ** * @paramのN:アン整数 * @param時間:整数の配列 * @return:整数 * / 公共INT copyBooksII(整数nは、INT []回){ IF(N == 0){ 0を返します。 } INT = 0、右=回左に[0] * N。 一方(左<右){ int型ミッド=左+(右 - 左)/ 2; IF(チェック(N、倍、MID)){ 右=半ば; } そうしないと { 左=ミッド+ 1; } } 戻り値は、左; } プライベートブールチェック(整数nは、INT []回、INT限界){ int型のカウント= 0; 以下のために(私はint型:回){ カウント+ =リミット/ I; } リターン回数> = N; } }