华为OD刷题C卷 - 每日刷题 27(游戏分组,分配土地)

2024-06-13 10:12

本文主要是介绍华为OD刷题C卷 - 每日刷题 27(游戏分组,分配土地),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、(游戏分组):

这段代码是解决“游戏分组”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,以及一个辅助方法dfs,用于计算将10名游戏爱好者分为两队时,两队实力差绝对值的最小值。

main方法首先读取10名参与者的游戏水平评分,然后调用getResult方法并打印出分组后两组实力差绝对值的最小值。

getResult方法首先对评分进行升序排序,然后使用回溯算法的dfs方法来找出所有可能的5人组合及其战斗力之和。通过递归生成所有不重复的组合,并将它们的战斗力之和存储在ArrayList中。

dfs方法是一个递归函数,用于生成10名参与者的所有可能组合,并计算每个组合的战斗力之和。它通过遍历参与者并选择或不选择每个参与者来构建组合。

最后,getResult方法计算所有组合的战斗力之和与总战斗力之和的差异,并找出这些差异的最小值。

2、(分配土地):

这段代码是解决“分配土地”的问题。它提供了一个Java类Main,其中包含main方法和一个内部类Rect,用于计算给定数字在矩阵中所占的最大矩形面积。

main方法首先读取矩阵的行数和列数,然后使用一个HashMap来存储每个数字的最小和最大行坐标以及最小和最大列坐标。通过遍历矩阵,更新每个数字的坐标范围。

Rect内部类用于记录每个数字的坐标范围,并提供方法来更新这些坐标。

最后,main方法遍历HashMap中的所有条目,计算每个数字所占的最大矩形面积,并找出所有矩形面积中的最大值。

package OD349;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;/*** @description 游戏分组* @level 7* @score 100* @type 回溯算法*//*** 题目描述* 部门准备举办一场王者荣耀表演赛,有 10 名游戏爱好者参与,分为两队,每队 5 人。* <p>* 每位参与者都有一个评分,代表着他的游戏水平。为了表演赛尽可能精彩,我们需要把 10 名参赛者分为示例尽量相近的两队。* <p>* 一队的实力可以表示为这一队 5 名队员的评分总和。* <p>* 现在给你 10 名参与者的游戏水平评分,请你根据上述要求分队,最后输出这两组的实力差绝对值。* <p>* 例:10 名参赛者的评分分别为:5 1 8 3 4 6 7 10 9 2,分组为(1 3 5 8 10)和(2 4 6 7 9),两组实力差最小,差值为1。有多种分法,但是实力差的绝对值最小为1。* <p>* 输入描述* 10个整数,表示10名参与者的游戏水平评分。范围在 [1, 10000] 之间。* <p>* 输出描述* 1个整数,表示分组后两组实力差绝对值的最小值。*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//10名玩家的评分int[] scores = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();System.out.println(getResult(scores));}//找到两队游戏水平最小绝对值差值public static int getResult(int[] scores) {//先按升序排序Arrays.sort(scores);//存放所有5人组合可能的战斗力之和ArrayList<Integer> res = new ArrayList<>();//dfs求10选5的去重组合,并将5人战斗力之和加入resdfs(scores, 0, 0, 0, res);//战斗力总和int sum = Arrays.stream(scores).sum();//res 中存放的是所有5人战斗力的集合,假如1队战斗力为sum1,另一队战斗力就是sum-sum1 差值的绝对值就是Math.abs(sum-2*sum1)//然后求差值的最小值return res.stream().map(sum1 -> Math.abs(sum - 2 * sum1)).min((a, b) -> a - b).orElse(0);}/*** 10选5去重组合,并将5人组合的战斗力之和加入res** @param scores 战斗力数组* @param index  开始的下标* @param level  树的层级* @param sum    当前的战斗力之和* @param res    存放结果* @return void* @create 2024/3/23 15:30*/public static void dfs(int[] scores, int index, int level, int sum, ArrayList<Integer> res) {//返回上一层标记,当level=5时,则已经添加了5人if (level == 5) {res.add(sum);return;}//没满5人,则添加,如果战斗力一样则去重for (int i = index; i < scores.length; i++) {//遍历到i后面的时候,如果跟前一个人战斗力一样,则去重,因为最后res求的是总和if (i > index && scores[i] == scores[i - 1]) {continue;}dfs(scores, i + 1, level + 1, sum + scores[i], res);}}}
package OD350;import java.util.HashMap;
import java.util.Scanner;/*** @description 分配土地* @level 3* @type 逻辑分析*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {//静态类,记录每个数字的最小最大坐标static class Rect {int minRow = Integer.MAX_VALUE;int maxRow = Integer.MIN_VALUE;int minCol = Integer.MAX_VALUE;int maxCol = Integer.MIN_VALUE;/** 更新该数字最大最小横坐标* @create 2024/3/9 23:11* @param row* @return void*/private void setRow(int row){this.minRow = Math.min(this.minRow,row);this.maxRow = Math.max(this.maxRow,row);}/** 更新该数字的最大最小纵坐标* @create 2024/3/9 23:12* @param col* @return void*/private void setCol(int col){this.minCol = Math.min(this.minCol,col);this.maxCol = Math.max(this.maxCol,col);}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()){//几行int m = sc.nextInt();//几列int n = sc.nextInt();HashMap<Integer,Rect> map = new HashMap<>();for (int i =0;i<m;i++){for (int j = 0;j<n;j++){int num = sc.nextInt();if (num>0){//若没有该num则新建一个Rect对象,修改当前数字所表示的最大最小坐标map.putIfAbsent(num,new Rect());map.get(num).setRow(i);map.get(num).setCol(j);}}}int maxArea = 0;//遍历for (int num : map.keySet()){//Rect rect = map.get(num);//maxArea = Math.max(maxArea,(rect.maxRow-rect.minRow+1)*(rect.maxCol-rect.minCol+1));maxArea = Math.max(maxArea, (map.get(num).maxRow - map.get(num).minRow + 1) * (map.get(num).maxCol - map.get(num).minCol + 1));}System.out.println(maxArea);}}
}

这篇关于华为OD刷题C卷 - 每日刷题 27(游戏分组,分配土地)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1057011

相关文章

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

Solr 使用Facet分组过程中与分词的矛盾解决办法

对于一般查询而言  ,  分词和存储都是必要的  .  比如  CPU  类型  ”Intel  酷睿  2  双核  P7570”,  拆分成  ”Intel”,”  酷睿  ”,”P7570”  这样一些关键字并分别索引  ,  可能提供更好的搜索体验  .  但是如果将  CPU  作为 Facet  字段  ,  最好不进行分词  .  这样就造成了矛盾  ,  解决方法

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @