C解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

具体思路:

计算总分:
首先计算所有分数的总和 sum。
从最多 mins 个队伍开始尝试,逐步减少队伍数量,直到找到最大可能分数。
检查分配是否可行:
如果 sum 不能被当前队伍数量整除,跳过。
如果可以整除,目标分数为 sum / p,尝试分配分数。
递归回溯分配:
使用回溯算法尝试将分数分配到每个队伍。
剪枝优化:
跳过重复的分配方案。
如果当前队伍的分数加上当前分数大于目标分数,则直接跳过

const readline = require('readline');

// 主函数:处理输入并调用逻辑
function main() {
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout,
    });

    let t; // 用于存储队伍的数量
    rl.on('line', (line) => {
        if (!t) {
            // 读取第一行输入,队伍数量
            t = parseInt(line);
        } else {
            // 读取第二行输入,分数列表
            const pts = line.split(' ').map(Number);
            const res = calcMVP(t, pts);
            console.log(res);
            rl.close();
        }
    });
}

// 计算 MVP 分数的函数
function calcMVP(mins, pts) {
    // 计算总分
    const sum = pts.reduce((a, b) => a + b, 0);

    // 尝试从最多队伍数量逐步减少
    for (let p = mins; p >= 1; p--) {
        // 检查是否可以将分数均分为 p 个队伍
        if (sum % p === 0 && valid(p, sum / p, [...pts])) {
            return sum / p; // 如果可以分配,返回每个队伍的分数
        }
    }
    return sum; // 如果无法分配,返回总分
}

// 检查是否能合理分配分数
function valid(pl, tgt, pts) {
    // 按分数从大到小排序,方便优先分配高分
    pts.sort((a, b) => b - a);

    // 如果最高分大于目标分数,直接返回 false
    if (pts[0] > tgt) return false;

    // 初始化每个队伍的当前得分
    const alloc = new Array(pl).fill(0);

    // 使用回溯算法检查是否可以分配
    return dfs(0, pts, tgt, alloc);
}

// 递归分配函数
function dfs(idx, pts, tgt, alloc) {
    // 如果所有分数都已成功分配,返回 true
    if (idx === pts.length) return true;

    // 获取当前分数
    const current = pts[idx];

    // 尝试将当前分数分配到每个队伍
    for (let i = 0; i < alloc.length; i++) {
        // 跳过重复的队伍分配方案
        if (i > 0 && alloc[i] === alloc[i - 1]) continue;

        // 如果当前队伍可以接受当前分数
        if (alloc[i] + current <= tgt) {
            alloc[i] += current; // 将分数分配给队伍
            // 递归分配下一个分数
            if (dfs(idx + 1, pts, tgt, alloc)) return true;
            alloc[i] -= current; // 回溯,移除当前分数
        }
    }
    return false; // 如果无法分配,返回 false
}

// 启动主函数
main();

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/144532617"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!