[2141] 同时运行 N 台电脑的最长时间

This commit is contained in:
kazusa 2025-12-05 11:34:10 +08:00
parent f3af494251
commit bd2feb1297
1 changed files with 63 additions and 0 deletions

View File

@ -0,0 +1,63 @@
/*
* @lc app=leetcode.cn id=2141 lang=javascript
* @lcpr version=
*
* [2141] 同时运行 N 台电脑的最长时间
*/
// @lc code=start
/**
* @param {number} n
* @param {number[]} batteries
* @return {number}
*/
var maxRunTime = function(n, batteries) {
let sum = batteries.reduce((acc, val) => acc + val, 0);
let left = 0, right = Math.floor(sum / n), ans = 0;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
let total = 0;
for (let cap of batteries) {
total += Math.min(cap, mid);
}
/**
* 关键理解一个电池只能给一台电脑供电
* 1. 如果电池数量 batteries.length < n电脑数量那么
* - 最多只能有 batteries.length 台电脑同时运行
* - 即使每个电池都贡献 midtotal = batteries.length * mid < n * mid
* - 所以 total >= n * mid 的条件会自动排除这种情况
*
* 2. 如果电池数量 batteries.length >= n那么
* - 每个电池最多贡献 Math.min(cap, mid)
* - 如果 total >= n * mid说明总电量足够可以用贪心策略分配
* * 优先用容量 >= mid 的电池每个贡献 mid n 台电脑各分配 mid 分钟
* * 剩余的小电池补充不足的部分
* - 如果 total < n * mid说明即使最优分配也无法满足
*
* 因此total >= n * mid 是充分必要条件
*/
if (total >= n * mid) {
ans = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
return ans;
};
console.log(maxRunTime(237,[8249,4114,2829,2270,3994,1868,1414,5503,7524,4500,1397,9127,1486,2355,797,4749,3246,7707,8744,9500,9720,2905,5418,4810,8778,5026,6419,3808,9385,6509,4086,2467,9611,1141,7394,8630,5892,3945,271,2896,1552,5524,806,6221,8931,1380,1365,1953,3199,4306,7447,2527,8947,2270,4266,1081,6657,8918,7465,9515,4905,6097,9812,5648,5199,4891,1391,7999,6332,6889,6193,9629,3297,6617,9933,3191,6514,1549,5459,8710,6255,1565,5020,2623,8643,9346,3310,1945,4885,827,330,6309,9968,7105,88,9426,4561,4735,9280,9479,5198,845,5981,1415,8795,751,2893,8027,2603,3280,4090,7472,6530,7786,8716,5443,5017,5226,1704,9487,5891,2312,6352,20,4702,8997,962,7786,4557,7021,4873,734,8646,895,1731,1400,8983,9025,7866,113,478,8837,2311,7823,296,1934,2651,7059,8197,3609,4946,8182,8234,9355,2525,1195,200,6338,9653,4183,4599,933,8839,728,1879,2317,7866,7339,3755,2256,4458,2321,946,4211,5197,4247,100,7616,7066,131,5336,2352,6860,9494,837,167,2754,482,7693,5011,7919,1921,2565,9173,5523,1460,3455,4378,5035,734,8920,8111,9175,1492,328,2843,705,6564,3284,3506,9085,667,8395,6086,5784,4822,7654,5875,8018,5103,1239,7829,491,157,5819,1794,5357,2989,6814,7442,9634,2389,532,207,5769,3204,5447,1324,3600,5610,2702,1112,720,3052,9335,7050,2685,1326,2739,5709,3099,877,8265,9094,8591,9309,9823,2638,8939,5614,7100,4147,9772,6138,3952,2856,1436,9189,4139,1705,7324,1494,3817,6814,3255,5435,9977,17,7299,6706,6849,4451,8491,9125,7809,2516,3864,9562]));
// @lc code=end
/*
// @lcpr case=start
// 2\n[3,3,3]\n
// @lcpr case=end
// @lcpr case=start
// 2\n[1,1,1,1]\n
// @lcpr case=end
*/