azl397985856 / fe-interview

宇宙最强的前端面试指南 (https://lucifer.ren/fe-interview)
Apache License 2.0
2.83k stars 260 forks source link

【每日一题】- 2020-08-21 #146

Closed azl397985856 closed 3 years ago

azl397985856 commented 4 years ago

有三种难度的睡目难度分别为 Easy,Medium,Hard,现在你总共有 E十EM+M十MH 十 H 道题。

各个字符串的含义如下:

你要用这些题目出尽可能多的模拟赛,为了保证题目质,且含有一定的区分度,每场模拟赛要包含Easy,Medium,Hard三种难度的题目各一道。求你.多能出多少场模拟赛.

function t(E, EM, M, MH, H) {}

t(2, 2, 1, 2, 2)
suukii commented 4 years ago

思路

因为每场模拟赛都要包含 Easy,Medium,Hard 三种难度的题目各一道,能出多少场模拟赛就取决于这三者的短板,数量最少的题目决定了模拟赛的场次。

除了 E, M, H 三种难度确定的题目外,还有 EM 道可以是 E 或 M 的题目以及 MH 道可以是 M 或 H 的题目。我们可以用两层循环来枚举所有把 EM 分配给 E 和 M,以及把 MH 分配给 M 和 H 的情况。

复杂度

代码

JavaScript Code

function t(E, EM, M, MH, H) {
    let ans = 0;
    for (let i = 0; i <= EM; i++) {
        for (j = 0; j <= MH; j++) {
            ans = Math.max(ans, Math.min(E + i, M + (EM - i) + j, H + (MH - j)));
        }
    }
    return ans;
}

t(2, 2, 1, 2, 2); // 3
azl397985856 commented 4 years ago

暴力

思路

代码(JS)

function t(E, EM, M, MH, H) {
 if (E < 1 && EM < 1) return 0
 if (EM < 1 && M < 1 && MH < 1) return 0
 if (H < 1) return 0
 return 1 + max(六种情况)
}

复杂度分析

记忆化递归(略)

复杂度分析

动态规划(略)

复杂度分析

贪心

思路

我们可以将 EM 到题 分为 i 道 E 和 EM - i 道 M。同理 MH 也是一样的。 因此总的可能就是 EM * MH。 我们暴力枚举所有可能求最大即可。

代码

function t(E, EM, M, MH, H) {
    let ans = 0
    for (let i = 0; i <= EM; i++) {
        for (j = 0; j <= MH; j++) {
            ans = Math.max(ans, Math.min(E + i, M + EM - i + j, H + MH - j))
        }
    }
    return ans
}

复杂度分析

stale[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.