【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 比赛的冠亚季军

news2024/11/15 13:58:40

为了更好的阅读体检,可以查看我的算法学习博客比赛的冠亚季军

题目描述

有个运动员,他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛,需要决出冠亚军。比赛的规则是0号和1号比赛,2号和3号比赛,以此类推,每一轮,相邻的运动员进行比赛,获N (3\leq N< 10000)胜的进入下一轮,实力值大的获胜,实力值相等的情况,id小的情况下获胜,轮空的直接进入下一轮。

输入描述

输入一行N个数字代表N的运动员的实力值(0\leq实力值\leq10000000000)。

输出描述

输出冠亚季军的id,用空格隔开。

样例

输入

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。

Java算法源码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;
 
public class Main {
  // 运动员类
  static class Sport {
    int id; // 运动员的id
    long strength; // 运动员的实力
 
    public Sport(int id, long strength) {
      this.id = id;
      this.strength = strength;
    }
  }
 
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
 
    long[] strengths = Arrays.stream(sc.nextLine().split(" ")).mapToLong(Long::parseLong).toArray();
 
    System.out.println(getResult(strengths));
  }
 
  public static String getResult(long[] strength) {
    // ans只记录三个组,冠军组,亚军组,季军组
    LinkedList<ArrayList<Sport>> ans = new LinkedList<>();
 
    // 将输入的实力值,转化为运动员集合
    ArrayList<Sport> sports = new ArrayList<>();
    for (int i = 0; i < strength.length; i++) sports.add(new Sport(i, strength[i]));
 
    // 晋级赛
    promote(sports, ans);
 
    // 冠军组如果不是一个人,那么还需要取出冠军组继续进行晋级赛
    while (ans.getFirst().size() > 1) {
      promote(ans.removeFirst(), ans);
    }
 
    // 冠军
    int first = ans.get(0).get(0).id;
 
    // 亚军
    int second = ans.get(1).get(0).id;
 
    // 季军
    ans.get(2)
        .sort(
            (a, b) ->
                a.strength != b.strength ? b.strength - a.strength > 0 ? 1 : -1 : a.id - b.id);
    int third = ans.get(2).get(0).id;
 
    return first + " " + second + " " + third;
  }
 
  public static void promote(ArrayList<Sport> sports, LinkedList<ArrayList<Sport>> ans) {
    // 记录获胜组
    ArrayList<Sport> win = new ArrayList<>();
    // 记录失败组
    ArrayList<Sport> fail = new ArrayList<>();
 
    for (int i = 1; i < sports.size(); i += 2) {
      // 序号大的运动员
      Sport major = sports.get(i);
      // 序号小的运动员
      Sport minor = sports.get(i - 1);
 
      if (major.strength > minor.strength) {
        win.add(major);
        fail.add(minor);
      } else {
        // 如果序号大的运动员的实力 <= 序号小的运动员,则序号小的运动员获胜
        win.add(minor);
        fail.add(major);
      }
    }
 
    // 如果晋级赛中运动员个数是奇数个,那么最后一个运动员直接晋级
    if (sports.size() % 2 != 0) {
      win.add(sports.get(sports.size() - 1));
    }
 
    // 依次头部压入失败组,获胜组,保证头部是获胜组
    ans.addFirst(fail);
    ans.addFirst(win);
 
    // 如果保留组个数超过3个,那么需要将超过部分的组去掉,因为这部分人已经无缘季军
    while (ans.size() > 3) ans.removeLast();
  }
}

JS算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
 
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
 
rl.on("line", (line) => {
  const sports = line
    .split(" ")
    .map(Number)
    .map((val, idx) => new Sport(idx, val));
 
  console.log(getResult(sports));
});
 
function getResult(sports) {
  // ans只记录三个组,依次是:冠军组,亚军组,季军组
  const ans = [];
 
  // 晋级赛
  promote(sports, ans);
 
  // 冠军组如果不是一个人,那么还需要取出冠军组继续进行晋级赛
  while (ans[0].length > 1) {
    promote(ans.shift(), ans);
  }
 
  // 冠军
  const first = ans[0][0].id;
  // 亚军
  const second = ans[1][0].id;
 
  // 季军
  ans[2].sort((a, b) =>
    a.strength != b.strength ? b.strength - a.strength : a.id - b.id
  );
  const third = ans[2][0].id;
 
  return `${first} ${second} ${third}`;
}
 
function promote(sports, ans) {
  // 记录获胜组
  const win = [];
  // 记录失败组
  const fail = [];
 
  for (let i = 1; i < sports.length; i += 2) {
    // 序号大的运动员
    const major = sports[i];
    // 序号小的运动员
    const minor = sports[i - 1];
 
    if (major.strength > minor.strength) {
      win.push(major);
      fail.push(minor);
    } else {
      // 如果序号大的运动员的实力 <= 序号小的运动员,则序号小的运动员获胜
      win.push(minor);
      fail.push(major);
    }
  }
 
  // 如果晋级赛中运动员个数是奇数个,那么最后一个运动员直接晋级
  if (sports.length % 2 != 0) {
    win.push(sports.at(-1));
  }
 
  // 依次头部压入失败组,获胜组,保证头部是获胜组
  ans.unshift(fail);
  ans.unshift(win);
 
  // 如果保留组个数超过3个,那么需要将超过部分的组去掉,因为这部分人已经无缘季军
  while (ans.length > 3) ans.pop();
}
 
class Sport {
  constructor(id, strength) {
    this.id = id; // 运动员的id
    this.strength = strength; // 运动员的实力
  }
}

Python算法源码

# 输入获取
tmp = list(map(int, input().split()))
 
 
class Sport:
    def __init__(self, idx, strength):
        self.idx = idx  # 运动员的id
        self.strength = strength    # 运动员的实力
 
 
# 将输入的实力值,转化为运动员集合
sports = []
for i in range(len(tmp)):
    sports.append(Sport(i, tmp[i]))
 
 
def promote(sports, ans):
    # 记录获胜组
    win = []
    # 记录失败组
    fail = []
 
    for i in range(1, len(sports), 2):
        # 序号大的运动员
        major = sports[i]
        # 序号小的运动员
        minor = sports[i-1]
 
        if major.strength > minor.strength:
            win.append(major)
            fail.append(minor)
        else:
            # 如果序号大的运动员的实力 <= 序号小的运动员,则序号小的运动员获胜
            win.append(minor)
            fail.append(major)
 
    # 如果晋级赛中运动员个数是奇数个,那么最后一个运动员直接晋级
    if len(sports) % 2 != 0:
        win.append(sports[-1])
 
    # 依次头部压入失败组,获胜组,保证头部是获胜组
    ans.insert(0, fail)
    ans.insert(0, win)
 
    # 如果保留组个数超过3个,那么需要将超过部分的组去掉,因为这部分人已经无缘季军
    while len(ans) > 3:
        ans.pop()
 
 
# 算法入口
def getResult():
    # ans只记录三个组,冠军组,亚军组,季军组
    ans = []
 
    # 晋级赛
    promote(sports, ans)
 
    # 冠军组如果不是一个人,那么还需要取出冠军组继续进行晋级赛
    while len(ans[0]) > 1:
        promote(ans.pop(0), ans)
 
    # 冠军
    first = ans[0][0].idx
 
    # 亚军
    second = ans[1][0].idx
 
    # 季军
    ans[2].sort(key=lambda x: (-x.strength, x.idx))
    third = ans[2][0].idx
 
    return f"{first} {second} {third}"
 
 
# 算法调用
print(getResult())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/658614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

014、数据库管理之配置管理

配置管理 TiDB配置系统配置集群配置配置的存储位置区分TiDB的系统参数和集群参数 系统参数系统参数的作用域系统参数的修改 集群参数集群参数的修改配置参数的查看 实验一&#xff1a; 在不同作用域下对数据库的系统参数进行修改session级别global级别 实验二&#xff1a; 修改…

Redis入门(二)

3.7 Redis 默认16个库 1&#xff09;Redis默认创建16个库,每个库对应一个下标,从0开始. 通过客户端连接后默认进入到0 号库&#xff0c;推荐只使用0号库. 127.0.0.1:6379> 16个是因为配置文件中是这样的 [aahadoop102 redis]$ vim redis.conf 2&#xff09;使用命令 sele…

DataX和SQLServer的导入导出案例

DataX和SQLServer的导入导出案例 文章目录 DataX和SQLServer的导入导出案例写在前面SQLServer数据库的简单使用SQLServer数据库一些常用的Shell脚本命令创建数据库 DataX 导入导出案例创建表并插入数据读取 SQLServer 的数据导入到 HDFS读取 SQLServer 的数据导入 MySQL 总结 写…

【C++Coppeliasim】UR机械臂位置正逆解Coppeliasim集成测试

前言&#xff1a; 基于改进的 Denavit-Hartenberg 参数的UR机械臂正向运动学求解和基于几何分析的逆运动学求解。该代码在 C 和 MATLAB 中可用&#xff0c;两者都与 CoppeliaSim 集成。 该解决方案是使用 Microsoft Visual Studio 2022 和 C 20 标准构建的。 依赖&#xff1a; …

C++ 类继承

目录 类继承基类派生一个类构造函数访问权限派生类与基类之间的特殊关系 完整demo 类继承 基类 #ifndef __TEST_1_H_ #define __TEST_1_H_ #include <iostream> #include<string> using namespace std; typedef unsigned int uint;//father class class TableTen…

《编译原理》2022年期末试卷

北京信息科技大学《编译原理》2022年期末考试 试卷附录

双指针-链表相交

面试题 02.07. 链表相交 同&#xff1a;160.链表相交 力扣题目链接 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保…

用c语言查找交通肇事者。

问题&#xff1a; 一辆卡车违反交通规则&#xff0c;撞人后逃跑。现场有3人目击事件&#xff0c;但都没有记住车号&#xff0c; 只记下车号的一些特征。 甲说&#xff1a;“牌照的前两位数字是相同的”。 乙说&#xff1a;“牌照的后两位…

如何高效阅读源码

最近在研究一款开源软件&#xff0c;从初步上手使用到源码分析&#xff0c;依靠看源码解决问题&#xff0c;可以说让自己在阅读源码能力上有了一点小的成长。鲁迅先生曾没说过&#xff0c;“源码是最好的文档”&#xff0c;他还没说过&#xff0c;“带着问题阅读源码最有效”。…

bat脚本添加以管理员权限执行方法

在windows上运行bat脚本的时候&#xff0c;有时候&#xff0c;会因为权限问题导致操作失败&#xff0c;这时候&#xff0c;需要在脚本中提升权限&#xff0c;以管理员权限执行脚本命令。 现在介绍两种方法可以实现管理员权限执行&#xff0c;如下所示&#xff0c;是一段以管理员…

【C++】STL的list容器介绍

目录 6、list容器 6.1list构造函数 6.2list赋值和交换 6.3list大小操作 6.4list插入 6.5list删除 6.6list数据存取 6.7list反转和排序 6、list容器 list本质是带头节点的双向循环链表&#xff0c;链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结…

学生必看!免费领取一台阿里云服务器

阿里云学生服务器优惠活动&#xff1a;高效计划&#xff0c;可以免费领取一台阿里云服务器&#xff0c;如果你是一名高校学生&#xff0c;想搭建一个linux学习环境、git代码托管服务器&#xff0c;或者创建个人博客网站记录自己的学习成长历程&#xff0c;拥有一台云服务器是很…

Redis 批处理优化

一、优化建议 1、使用Pipeline Redis 的 Pipeline 可以将多个命令打包成一个请求&#xff0c;从而减少通信次数和网络开销。在批处理时&#xff0c;可以使用 Pipeline 来提高效率。 2、使用批量插入 Redis 支持批量插入&#xff0c;可以将多个数据一次性插入数据库&#xf…

一文看完Vue3的渲染过程

Vue3官网中有下面这样一张图&#xff0c;基本展现出了Vue3的渲染原理&#xff1a; 本文会从源码角度来草率的看一下Vue3的运行全流程&#xff0c;旨在加深对上图的理解&#xff0c;从下面这个很简单的使用示例开始&#xff1a; import { createApp, ref } from "vue"…

Python3 列表与元组 | 菜鸟教程(六)

目录 一、Python3 列表 &#xff08;一&#xff09;简介相关 1、序列是 Python 中最基本的数据结构。 2、序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 3、Python 有 6 个序列的内置…

Qt编写手机版本视频播放器和Onvif工具(可云台和录像)

一、前言 用Qtffmpeg写播放器很多人有疑问&#xff0c;为何不用Qt自己的多媒体框架来写&#xff0c;最重要的原因是Qt自带的目前都依赖具体的本地解码器&#xff0c;如果解码器不支持&#xff0c;那就是歇菜的&#xff0c;最多支持个MP4格式&#xff0c;而且在手机上也都是支持…

有效的括号

数据结构与算法应用往往隐藏在我们看不到的地方 20. 有效的括号 力扣题目链接 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括…

【Python 随练】打印楼梯与笑脸

题目&#xff1a; 打印楼梯&#xff0c;并在楼梯上方打印两个笑脸 简介&#xff1a; 在本篇博客中&#xff0c;我们将使用 Python 代码打印一个楼梯&#xff0c;并在楼梯上方打印两个笑脸。我们将给出问题的解析&#xff0c;并提供一个完整的代码示例来实现这个效果。 问题…

多目标优化算法:多目标浣熊优化算法(multi-objective Coati Optimization Algorithm,MOCOA)

一、浣熊优化算法COA 浣熊优化算法&#xff08;Coati Optimization Algorithm&#xff0c;COA&#xff09;由Dehghani Mohammad等人于2022年提出的模拟浣熊狩猎行为的优化算法&#xff0c;该算法具有进化能力强&#xff0c;收敛速度快&#xff0c;收敛精度高等特点。 COA具体…

【算法与数据结构】454、LeetCode 四数相加 II

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题不仅要计算元素的和为0&#xff0c;还要计算元素和为零出现的次数&#xff0c;说明这道题map比较…