游戏分组/王者荣耀

题目描述

部门准备举办一场王者荣耀表演赛,有 10 名游戏爱好者参与,分 5 为两队,每队 5 人。
每位参与者都有一个评分,代表着他的游戏水平。
为了表演赛尽可能精彩,我们需要把 10 名参赛者分为实力尽量相近的两队。一队的实力可以表示为这一队 5 名队员的评分总和。
现在给你 10 名参与者的游戏水平评分,请你根据上述要求分队最后输出这两组的实力差绝对值。
例: 10 名参赛者的评分分别为 5 1 8 3 4 6 7 10 9 2,分组为 (1 3 5 8 10) (2 4 6 7 9),两组实力差最小,差值为 1。有多种分法,但实力差的绝对值最小为 1。

输入描述

10 个整数,表示 10 名参与者的游戏水平评分。范围在[1,10000]之间

输出描述

1 个整数,表示分组后两组实力差绝对值的最小值。

示例一

输入

1 2 3 4 5 6 7 8 9 10

输出

1

说明

10 名队员分成两组,两组实力差绝对值最小为 1。

代码

#include 
#include 
#include 
int total = 0;
int res = INT_MAX;
// 深度优先搜索函数
void dfs(int score[10], int idx, int count, int currentSum) {
    // 当我们为一个队伍选择了5名玩家时
    if (count == 5) {
        // 计算另一个队伍的总和
        int otherTeamSum = total - currentSum;
        // 用较小的差值更新结果
        res = abs(currentSum - otherTeamSum) < res
                  ? abs(currentSum - otherTeamSum)
                  : res;
        return;
    }
    // 如果我们已经考虑了所有玩家,停止递归
    if (idx == 10) {
        return;
    }
    // 为第一个队伍选择当前玩家
    dfs(score, idx + 1, count + 1, currentSum + score[idx]);
    // 不为第一个队伍选择当前玩家
    dfs(score, idx + 1, count, currentSum);
}
int main() {
    int score[10];
    for (int i = 0; i < 10; i++) {
        scanf("%d", &score[i]);
        total += score[i];
    }

    dfs(score, 0, 0, 0);
    printf("%d", res);
    return 0;
}

注意:

是 C 语言的一个标准库头文件,它定义了各种数据类型(如整数、浮点数等)的最小和最大可能值。在程序中包含 头文件后,可以使用预定义的宏来访问这些值。

例如,在给定的代码片段中,INT_MAX 就是来自 的一个预定义宏,表示 int 类型的最大值。这个宏在初始化变量 res 时被用作初始的最大可能实力差:

int res = INT_MAX;

通过这样的方式,我们可以确保 res 被初始化为一个足够大的数值,以便在后续计算中能够容纳任何可能出现的实力差,并能够在遍历所有分组方案后更新到真正的最小实力差。

你可能感兴趣的:(刷题,深度优先,数据结构,c语言,华为od,dfs)