华为od算法_游戏分组_Java

华为od算法_游戏分组_Java

题目

部门准备举办一场王者荣耀表演赛,有 10 名游戏爱好者参与,分为两队,每队 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。

代码

public class Test4 {
    // 回溯法
    static int minDif = Integer.MAX_VALUE;//用来存放两队最小评分差
    static int sum = 0;// 10个人评分总和
    static LinkedList<Integer> path = new LinkedList<Integer>();//存放路径(哪些已经被A队选了)
    // 1、确定递归函数返回值及参数(返回值:路径和,参数:数列n,层数k(也就是已取数字),起点start)
    // 2、确定回溯函数终止的条件(层数path.length==n长度/2,也就是10/2)
    // 3、单层搜索的过程(先把结点加进去,递归找路径和最接近总和二分之一的路径;然后回溯,下一轮搜索)

    /**
     * 找到两组实力差最小值
     * @param input 输入无序数列
     * @return 两组实力差绝对值最小值
     */
    public static int findMinDifference(int[] input){
        int len = input.length;
        for(int i = 0; i < len; i++){
            sum += input[i];
        }
        backTrack(input, len/2, 0);
        return minDif;
    }
    public static void backTrack(int[] input, int k, int start){
        if(path.size() >= k){ //终止
            // 计算path中数值和
            int sum1 = 0;
            for(int i = 0; i < path.size(); i++){
                sum1 += path.get(i);
            }
            int sum2 = sum - sum1;
            int dif = Math.abs(sum1-sum2);
            if(dif < minDif){
                minDif = dif;
            }
            return;
        }
        for(int i = start; i <= input.length - (k-path.size()); i++){
            path.add(input[i]);
            backTrack(input, k, start+1);
            path.removeLast();
        }
    }

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        String in = s.nextLine();
        String[] inputS = in.split(" ");
        int [] ints = new int[inputS.length];
        for(int i = 0; i < inputS.length; i++){
            ints[i] = Integer.valueOf(inputS[i]);
        }
        System.out.println(findMinDifference(ints));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值