【华为OD题库-031】比赛的冠亚季军-java
题目
有N(3<=N<10000)个运动员,他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛,需要决出冠亚军。比赛的规则是0号和1号比赛,2号和3号比赛,以此类推,每一轮,相邻的运动员进行比赛,获胜的进入下轮;实力值大的获胜,实力值相等的情况,id小的情况下获胜:轮空的直接进入下一轮.
输入描述:
输入一行N个数字代表N的运动员的实力值(0<=实力值<=10000000000).
输出描述:
输出冠亚季军的id,用空格隔开.
示例1
输入:
2 3 4 5
输出:
3 1 2
说明:
第一轮比赛,id为0实力值为2的运动员和id为1实力值为3的运动员比赛,1号胜出进入下一轮争夺冠亚军,id为2的运动员和id为3的运动员比赛,3号胜出进入下一轮争夺冠亚军;
冠亚军比赛,3号胜1号:故冠军为3号,亚军为1号。
2号和0号,比赛进行季军的争夺,2号实力值为4,0号实力值2,故2号胜出,得季军。
冠亚季军为3 1 2。
思路
每轮相邻的运动员分入一组比赛,每轮结束后,数组的长度由len变为(len+1)/2,加一的原因为轮空的直接进入下一轮。具体来讲:
假设len为偶数8,那么每轮len的变化过程为:8>4>2>1,长度为2时,争夺冠亚,长度为1时,得到冠军,长度为4时,可以得到4强,季军为4强中非冠亚的较大值。
假设len为基数9,那么每轮len的变化过程为:9>5>3>2>1,长度为2时,争夺冠亚,长度为1时得到冠军,长度为3时,3个运动员中减去冠亚就得到季军。
所以当数组长度降低为3或4时,最终的冠亚季军都在这个数组中,可以先保存数组的值。然后继续下一轮,当进行到最后一轮时(len=1),得到了冠军,再反推回来,就可以分别得到亚军和季军。
考虑到实力分值范围最大值为10000000000,超过了Integer,所以实力分值应该用long表示
题解
package hwod;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;public class Competition2 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);long[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToLong(Long::parseLong).toArray();int[] res = competition(nums);for (int i = 0; i < res.length; i++) {if (i != 0) System.out.print(" ");System.out.print(res[i]);}}private static int[] competition(long[] nums) {int[] res = new int[3];//存储最终的冠亚季军idint[] indexs = new int[nums.length];//记录每个人的id,每轮淘汰时,淘汰id即可for (int i = 0; i < nums.length; i++) {indexs[i] = i;}List<Integer> lst4 = new ArrayList<>();//存储4强while (indexs.length > 1) {if (indexs.length == 4 || indexs.length == 3) {lst4 = Arrays.stream(indexs).boxed().collect(Collectors.toList());}int[] newIndexs = new int[(indexs.length + 1) / 2]; //每轮淘汰一半的人数for (int i = 0; i < indexs.length; i += 2) {if (i + 1 < indexs.length && nums[indexs[i]] < nums[indexs[i + 1]]) {newIndexs[i / 2] = indexs[i + 1];} else {newIndexs[i / 2] = indexs[i];}}if (newIndexs.length == 1) {//得出冠军res[0] = newIndexs[0];//得到亚军,此时indexs长度必为2,排除冠军就是亚军了res[1] = indexs[0] == res[0] ? indexs[1] : indexs[0];}indexs = newIndexs;}Integer[] lst4new = lst4.stream().filter(x -> x != res[0] && x != res[1]).toArray(Integer[]::new);//从4强里排除冠亚军,如果剩余1个,那么那一个就是季军,如果剩余2个,那么其中的较大值是季军。if (lst4new.length == 1 || lst4new[0] >= lst4new[1]) {res[2] = lst4new[0];} else {res[2] = lst4new[1];}return res;}
}
使用indexs来记录运动员的编号可能不太直观,可以考虑直接使用自定义对象来进行排序。如下:
package hwod;import java.util.*;
import java.util.stream.Collectors;public class Competition2 {private static List<CPlayer> wins = new ArrayList<>();public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();int[] res = competition(nums);for (int i = 0; i < res.length; i++) {if (i != 0) System.out.print(" ");System.out.print(res[i]);}}private static int[] competition(int[] nums) {int[] res = new int[3];for (int i = 0; i < nums.length; i++) {wins.add(new CPlayer(i, nums[i]));}List<CPlayer> lst4=new ArrayList<>();while (wins.size() > 2) {if (wins.size()==4||wins.size()==3) {lst4 = wins;}List<CPlayer> tmpList = new ArrayList<>();for (int i = 0; i < wins.size(); i += 2) {//>0,说明按照排序规则i该排在i+1后面,即i+1晋级if (i + 1 < wins.size() && wins.get(i).compareTo(wins.get(i + 1)) > 0) {tmpList.add(wins.get(i + 1));} else {tmpList.add(wins.get(i));}}wins = tmpList;}//最后剩下的wins一定是两个长度,产生冠亚军List<CPlayer> loser = lst4.stream().filter(x -> !wins.contains(x)).collect(Collectors.toList());Collections.sort(wins);Collections.sort(loser);res[0] = wins.get(0).getId();res[1] = wins.get(1).getId();res[2] = loser.get(0).getId();return res;}class CPlayer implements Comparable<CPlayer> {private int id;private long score;public int getId() {return id;}public void setId(int id) {this.id = id;}public long getScore() {return score;}public void setScore(long score) {this.score = score;}public CPlayer(int id, long score) {this.id = id;this.score = score;}@Overridepublic int compareTo(CPlayer o) {if (this.score == o.score) return this.id - o.id;return Long.compare(o.score, this.score);}
}
推荐
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。
相关文章:
【华为OD题库-031】比赛的冠亚季军-java
题目 有N(3<N<10000)个运动员,他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛,需要决出冠亚军。比赛的规则是0号和1号比赛,2号和3号比赛,以此类推,每一轮,相邻的运动员进行比赛&#…...

电脑如何禁止截屏
禁止电脑截屏是一项重要的安全措施,可以保护用户隐私和防止恶意软件的使用。以下是几种禁止电脑截屏的方法: 形式一: 一刀切,全部禁止截屏 可以在域之盾软件后,点击桌面管理,然后选择禁止截屏。就能禁止所…...

【Web】NewStarCTF Week1 个人复现
目录 ①泄露的秘密 ②Begin of Upload ③Begin of HTTP ④ErrorFlask ⑤Begin of PHP ⑥R!C!E! ⑦EasyLogin ①泄露的秘密 盲猜/robots.txt,访问得到flag前半部分 第二个没试出来,老老实实拿dirsearch扫吧 访问/www.zip 下载附件,拿到第二部分…...

Android 提示框代码 java语言
在Android中,你可以使用 AlertDialog 类来创建提示框。以下是一个简单的Java代码示例,演示如何创建和显示一个基本的提示框: import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; im…...
【c语言】二维数组的对角线对称交换
c语言,假设已经有了一个二维数组,对其进行对角线对称变换,如(0,1)与(1,0)变换,并打印。 示例 #include <stdio.h>void swap(int *a, int *b) {int te…...
Sulfo-CY3 NHS荧光染料的制备和表征
Sulfo-CY3 NHS(源自星戈瑞的花菁染料)荧光染料的制备和表征是确保染料质量和性能的关键步骤。制备Sulfo-CY3 NHS荧光染料: 原材料准备:准备所需的原材料,包括CY3 NHS ester(或等效的前体),用于制备Sulfo-C…...

数字乡村:科技赋能农村产业升级
数字乡村:科技赋能农村产业升级 数字乡村是指通过信息技术和数字化手段,推动农业现代化、农村经济发展和农民增收的一种新模式。近年来,随着互联网技术的飞速发展,数字乡村开始在全国范围内迅速兴起,为乡村经济注入了新…...

K8S部署mongodb-sharded-cluster(7.0.2)副本分片
添加源 helm repo add bitnami https://charts.bitnami.com/bitnami指定版本拉取 helm pull --repo https://charts.bitnami.com/bitnami mongodb-sharded --version 7.0.5安装时选择SCRAM-SHA-1默认是SCRAM-SHA-256 helm install -n prod mymongodb mongodb-sharded --value…...

Dockerfile-CentOS7.9+Python3.11.2
本文为CentOS7.9下安装Python3.11.2环境的Dockerfile # CentOS with Python3.11.2 # Author xxmail.com# build a new image with basic centos FROM centos:centos7.9.2009 # who is the author MAINTAINER xxmail.comRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/…...
自定义责任链Filter实现
核心接口 Filter package com.xxx.arch.mw.nbp.common.extension;import com.xxx.commons.data.domain.Result;/*** date 2023/08/25*/ public interface Filter {Result invoke(final Invoker invoker, final Invocation invocation); } Invoker package com.xxx.arch.mw.…...

NX二次开发UF_CSYS_create_matrix 函数介绍
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_create_matrix Defined in: uf_csys.h int UF_CSYS_create_matrix(const double matrix_values [ 9 ] , tag_t * matrix_id ) overview 概述 Creates a 3 x 3 matrix. 创建…...

css引入的三种方式
css引入的三种方式 一、内联样式二、外部样式表三、 内部样式表总结trouble 一、内联样式 内联样式也被称为行内样式。它是将 CSS 样式直接应用于 HTML 元素的 style 属性中的一种方式 <p style"color: blue; font-size: 16px;">这是一个带有内联样式的段落。&…...
含羞草研究所研究含羞草的代码
点击进入 一个简单的Python代码示例,用于模拟含羞草的行为: class Mimosa: def __init__(self): self.leaves_open True def touch_leaf(self): if self.leaves_open: print("Leaf closes due to touch.") self.leaves_open False else: p…...
常见立体几何图形的体积
文章目录 abstract祖暅原理推论 棱锥和圆锥的体积用积分的方法推导棱台和圆台的体积圆台体积公式 球体的体积球体的表面积 abstract 锥体和球体的体积公式主要通过积分的方法推导 这类公式的推导中学一般不要求,只要会应用公式在高等数学中由合适和方便的工具来推导这些公式而…...
vue3 + vue-router + keep-alive缓存页面
1.vue-router中增加mate.keepAlive和deepth属性 {path: /,name: home,component: HomeView,meta: {// 当前页面要不要缓存keepAlive: false,// 当前页面层级deepth: 1,}},{path: /list,name: list,component: ListView,meta: {// 当前页面要不要缓存keepAlive: true,// 当前页…...

unigui同页面内重定向跳转,企业微信内部应用开发获取用户code例子
procedure TMainForm.UniFormCreate(Sender: TObject); varurl: string;code: string; begin //如果没有code值,将进行重定向if UniApplication.Parameters.Values[code] thenbeginurl :https://open.weixin.qq.com/connect/oauth2/authorize?appid你们的企业ID&…...
垃圾数据啊
const arr [] //定义空数组 for (const key in this.fgkSyData) { //循环 this。sgksudata 数据arr.push( //push添加到 arr { [key]:this.fgkSyData[key] } //{} 在对象中 重新 定义key value 转换成对象) } console.log(arr, arr) …...
GB/T 29498-2013 木门窗检测
木门窗是指以木材、木质复合材料为主要材料制作框和扇的门窗。 GB/T 29498-2013 木门窗检测项目 测试项目 测试标准 外观质量 GB/T 29498 尺寸 GB/T 29498 装配质量 GB/T 29498 含水率 GB/T 17657 附着力 GB/T 4893.4 外门窗耐冷热循环 GB/T 4893.7 耐划痕 GB/…...

rocketMQ5.0顺序消息golang接入
本人理解,顺序消息如果不分消息组,那么会影响并行处理速度,所以尽量消息组分的散一些 首先上要求,官方文档如下: 总结: 1.必须同一个消息组,消息组和消费组不是一个概念,不要混 2.必…...

HuggingFace-利用BERT预训练模型实现中文情感分类(下游任务)
准备数据集 使用编码工具 首先需要加载编码工具,编码工具可以将抽象的文字转成数字,便于神经网络后续的处理,其代码如下: # 定义数据集 from transformers import BertTokenizer, BertModel, AdamW # 加载tokenizer token Ber…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...