华为OD题目:MVP只争夺战

MVP只争夺战

知识点DFS搜索
时间限制: 1s 空间限制: 256MB 限定语言: 不限

题目描述:
在星球争霸篮球赛对抗赛中,强大的宇宙战队,希望每个人都能拿到MVP.
MVP的条件是,单场最高分得分获得者,可以并列,所以宇宙战队决定在比赛中,尽可能让更多的队员上场,且让所有有得分的队员得分都相同。
然而比赛过程中的每一分钟的得分都只能由某一个人包揽

输入描述:
输入第一行为一个数字t,表示有得分的分钟数 ( 1<= t <= 50),第二行为t个数字,代表每一分钟的得分p(1 = p<= 50)
输出描述:
输出有得分的队员都是MVP时最少的MVP得分

示例1
输入:
9
5 2 1 5 2 1 5 2 1
输出:
6

说明:
样例解释:一共4人得分,分别都为6分
5 + 1
5 + 1
5 + 1

解题思路:

  • 用dfs分方式
  • 因为要求平均分成n组,每组的总得分一样,那么先将数组排序,取最大的值,这个最大值就是min,表示每组最小得分为min,最大的得分为sum,
  • 为了方便遍历,取值到sum/2,表示两组得分(不一定符合条件),只是为了缩短遍历的个数
  • min <= score <= sum/2
  • 具体步骤如下:
  • 1: 先看sum%score能不能被整除,能不能每组都得分是score,不能就进下一个循环
  • 2: 分组个数 n = sum/score, 循环n次,要求每次dfs都能在数组里,找到几个组员加起来恰好等于score,只要有一组不符合,直接break,说明不满足
  • 3: 在遍历过程中,使用used数组来标记已经使用过的下标,表示前面已经使用它分组成功了,后面的不能再使用了
import java.util.*;

public class My {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int len = sc.nextInt();
        sc.nextLine();
        String[] p = sc.nextLine().split(" ");
        int[] scores = new int[len];

        for (int i = 0; i < p.length; i++) {
            scores[i] = Integer.parseInt(p[i]);
        }

        int count = Arrays.stream(scores).sum();
        Arrays.sort(scores);      //对数组进行排序,
        int min = scores[len - 1];    //求出数组中最大值,为MVP最低得分,因为每个MVP的得分是一样的

        int res = 0;

        boolean[] used = new boolean[scores.length];

        //以2个人平分的分数为边界
        for (int i = min; i <= count / 2; i++) {
            if (count % i == 0) {   //得分总数可以整除得分
                int score = i;      //当前平均分
                Arrays.fill(used, false);
                //num表示可以由几组数组成
                int num = count / i;
                boolean canCombine = true;
                //要求每一组都能够从scores数组里找到组合,否则就不符合
                for (int j = 0; j < num; j++) {
                    canCombine = canCombine(scores, used, score, len - 1);
                    //只要由一组没能组合完成,说明不符合
                    if (!canCombine) {
                        break;
                    }
                }

                if (canCombine) {
                    res = score;
                    break;
                }
            }
        }
        System.out.println(res == 0 ? count : res);     //分数平分不成功则输出总分
    }

    public static boolean canCombine(int[] scores, boolean[] used, int score, int index) {
        if (score == 0) {
            return true;
        }
        for (int i = index; i >= 0; i--) {
            //已经使用,进入下一个循环
            if (used[i]) {
                continue;
            }
            //当前的分数比目标分值大,不符合
            int curVal = scores[i];
            if (curVal > score) {
                continue;
            }
            //记录下标已经被使用
            used[i] = true;
            return canCombine(scores, used, score - curVal, i - 1);
        }
        return false;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MVP争夺战是一道华为OD机试题,要求使用Java语言实现。MVP模式是一种经典的软件架构模式,它将应用程序分成三个部分:模型(Model)、视图(View)、控制器(Presenter)。通过构建这种模式,可以使应用程序更易于维护和测试,并且不同的部分可以独立开发。MVP争夺战要求实现一个简单的场景,其中有两个队伍:蓝队和红队。选手可以选择加入其中一个队伍。每个队伍会派出若干个选手进行争夺战,战斗时间为30秒。每个选手都有一定的攻击力和生命值。获胜的队伍将获得胜利,获胜选手的攻击力和生命值还会有所提升。 为了实现这个场景,我们可以采用MVP模式进行设计。首先,我们需要定义Model类来表示选手,其中包括选手的攻击力和生命值等属性。然后,我们需要定义View类来显示游戏场景,例如显示两个队伍的选手列表、选手的属性等信息。最后,我们需要定义Presenter类来协调Model和View之间的交互,例如当选手攻击时,Presenter需要计算选手的伤害值,并更新选手的生命值,最后将更新后的结果显示在View上。 使用MVP模式设计程序,可以使程序的各个部分高度耦合,并且易于扩展和调试。此外,该设计模式还可以使开发者更好地组织代码,使代码更加清晰易懂。在实现时,需要注意各个部分的交互和数据流的控制,确保程序的正确性和功能完整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值