首页 > 编程语言 >【华为OD机试真题】A卷-士兵过河(Python)

【华为OD机试真题】A卷-士兵过河(Python)

时间:2024-03-28 21:30:57浏览次数:14  
标签:13 12 真题 Python OD 用时 示例 士兵 dp

一、题目描述

【华为OD机试真题】A卷-士兵过河(Python)

题目描述:

一支N个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河。 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭。 现在军队只找到了1只小船,这船最多能同时坐上2个士兵。
1)当1个士兵划船过河,用时为 a[i];0 <= i < N

2)当2个士兵坐船同时划船过河时,用时为max(a[j],a[i])两士兵中用时最长的。

3)当2个士兵坐船1个士兵划船时,用时为 a[i]*10;a[i]为划船士兵用时。

4)如果士兵下河游泳,则会被湍急水流直接带走,算作死亡。 请帮忙给出一种解决方案,保证存活的士兵最多,且过河用时最短。

二、输入输出

输入描述:
第一行:N 表示士兵数(0<N<1,000,000) 
第二行:T 表示敌军到达时长(0 < T < 100,000,000) 
第三行:a[0] a[1] … a[i]… a[N- 1] 
a[i]表示每个士兵的过河时长。 
(10 < a[i]< 100; 0<= i< N)
输出描述:
第一行:”最多存活士兵数” “最短用时”

三、参考示例

示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
5
43
12 13 15 20 50
输出:
3 40
说明:
可以达到或小于43的一种方案: 
第一步:a[0] a[1] 过河用时:13 
第二步:a[0] 返回用时:12 
第三步:a[0] a[2] 过河用时:15
示例2 输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
5
130
50 12 13 15 20
输出:
5 128
说明:
可以达到或小于130的一种方案: 
第一步:a[1] a[2] 过河用时:13 
第二步:a[1] 返回用时:12 
第三步:a[0] a[5] 过河用时:50 
第四步:a[2] 返回用时:13 
第五步:a[1] a[2] 过河用时:13 
第六步:a[1] 返回用时:12 
第七步:a[1] a[3] 过河用时:15 
所以输出为:5 128
示例3 输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
7
171
25 12 13 15 20 35 20
输出:
7 171
说明
可以达到或小于60的一种方案: 
第一步:a[1] a[2] 过桥用时:13 
第二步:a[1] 带火把返回用时:12 
第三步:a[0] a[5] 过桥用时:35 
第四步:a[2] 带火把返回用时:13 
第五步:a[1] a[2] 过桥用时:13 
第六步:a[1] 带火把返回用时:12 
第七步:a[4] a[6] 过桥用时:20 
第八步:a[2] 带火把返回用时:13 
第九步:a[1] a[3] 过桥用时:15 
第十步:a[1] 带火把返回用时:12 
第十一步:a[1] a[2] 过桥用时:13
所以输出为:
7 171
备注:
1)两个士兵的同时划船时,如果划速不同则会导致船原地转圈圈;所以为保持两个士兵划速相同,则需要向划的慢的士兵看齐。 2)两个士兵坐船时,重量增加吃水加深,水的阻力增大;同样的力量划船速度会变慢; 3)由于河水湍急大量的力用来抵消水流的阻力,所以2)中过河用时不是a[i] *2, 而是a[i] * 10。

四、解题思路

  1. 定义一个 TreeNode 类来表示树节点。
  2. 定义一个函数 shorter_time 来返回两个数中较小的值。
  3. 处理输入,读取 N 和 T 的值,以及列表 a
  4. 对列表 a 进行排序。
  5. 初始化一个长度为 N 的列表 dp,用于存储中间结果。
  6. 使用动态规划的思想,计算 dp 数组的值。
  7. 如果计算过程中超过了阈值 T,则输出结果并结束计算。

五、参考代码 

# -*- coding: utf-8 -*-
'''
@Time    :   2023/12/10 00:09:00
@Author  :   mgc 
@Version :   1.0
@Desc    :   None
'''

# import os
# import re
# import sys
# import copy
# import math
# import queue
# import functools
# from queue import Queue
# from collections import Counter, defaultdict

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def shorter_time(a, b):
    # 返回较小的值
    if a * 10 < b:
        return a * 10
    return b

# 处理输入
N = int(input())
T = int(input())
a = [int(x) for x in input().split(" ")]
a = sorted(a)

dp = [0 for _ in range(N)]

skip_flag = False
for i in range(N):
    if i == 0:
        dp[0] = a[0]
        if dp[0] > T:
            print("0 0")
            skip_flag = True
            break
    elif i == 1:
        dp[1] = a[1]
    else:
        dp[i] = min(dp[i - 1] + a[i] + a[0], dp[i - 2] + a[0] + a[i] + a[1] + a[1])

    if dp[i] > T:
        skip_flag = True
        print(str(i) + " " + str(dp[i - 1]))
        break

if not skip_flag:
    print(str(N) + " " + str(dp[N - 1]))

六、华为OD机试真题汇总目录

    【华为OD机试】真题汇总A+B+C+D券(Python实现)

    【华为OD机试】真题汇总A+B+C+D卷(JAVA实现)

    【华为OD机试】真题汇总A+B+C+D卷(C++实现)

标签:13,12,真题,Python,OD,用时,示例,士兵,dp
From: https://blog.csdn.net/u014481728/article/details/137121428

相关文章

  • 【华为OD机试真题】A卷-日志首次上报最多积分(JAVA)
    一、题目描述【华为OD机试真题】A卷-日志首次上报最多积分(JAVA)题目描述:日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。如果上报太频繁,会对服务端造成压力;如果上报太晚,会降低用户的体验;如果一次上报的条数太多,会导致超时失败。为此,项......
  • Python math 模块
    Pythonmath模块Python math 模块提供了许多对浮点数的数学运算函数。math 模块下的函数,返回值均为浮点数,除非另有明确说明。如果你需要计算复数,请使用 cmath 模块中的同名函数。要使用math函数必须先导入:importmath查看math模块中的内容:importmathprint......
  • Python3 迭代器与生成器
    在Python中,迭代器(Iterator)是一个用于迭代访问集合元素的对象。迭代器会记住遍历的位置,使得我们可以依次访问集合中的每个元素而不必了解集合内部结构。在Python中,内置的​iter()​函数用于从可迭代对象(如字符串、列表、元组等)中创建迭代器,而​next()​函数则用于获取迭代器......
  • 【LeetCode】1607. 没有卖出的卖家
    题目表:Customer+---------------+---------+|ColumnName|Type|+---------------+---------+|customer_id|int||customer_name|varchar|+---------------+---------+customer_id是该表具有唯一值的列。该表的每行包含网上商城的每一位顾客的......
  • 进入虚拟机的annocoda3的bin目录
    首先进入到anacoda3的bin目录下然后输入sourceactivate命令来打开anacodapromat命令窗口输入jupyternotebookpassword来设置密码,我就设置了123456虚拟机搭建jupyternotebook服务_虚拟机安装jupyternotebook-CSDN博客......
  • 【LeetCode】1873. 计算特殊奖金
    题目表:Employees+-------------+---------+|列名|类型|+-------------+---------+|employee_id|int||name|varchar||salary|int|+-------------+---------+employee_id是这个表的主键(具有唯一值的列)。此表的每一行......
  • Large Language Models Based Fuzzing Techniques: A Survey
    本文是LLM系列文章,针对《LargeLanguageModelsBasedFuzzingTechniques:ASurvey》的翻译。基于大型语言模型的模糊化技术综述摘要1引言2背景3基于LLM的模糊测试分析4关于未来工作和挑战的讨论5结论摘要在软件发挥关键作用的现代,软件安全和漏洞分析......
  • Stepwise Self-Consistent Mathematical Reasoning with Large Language Models
    本文是LLM系列文章,针对《StepwiseSelf-ConsistentMathematicalReasoningwithLargeLanguageModels》的翻译。基于大型语言模型的逐步自洽数学推理摘要1引言2相关工作3TriMaster100数据集4循序渐进的自洽思维链5实验6结论摘要使用大型语言模型进......
  • 如何使用Python读取、旋转和和创建空白的PDF文件
    试想象一下,你正在处理一堆PDF文件,需要从中提取一些信息或者修改其中的内容。如果你不使用Python,你可能需要手动打开每个文件,复制粘贴你需要的内容,然后再保存为一个新的文件。这简直是一场噩梦!但是,有了Python,你可以轻松地编写一个脚本来自动化这个过程,节省大量时间和精力。那......
  • Python对PDF文件加密和添加水印大揭秘!
    ​Python这个编程语言,不仅因为它语法简洁易懂,还因为它能帮我解决各种实际问题。最近我就用Python给PDF文件加了密,还添了个酷炫的水印,感觉自己瞬间变成了文件安全的小能手!首先,得说说这个PDF加密。你知道吗,现在网上各种资料满天飞,保护自己的文档不被他人随意查看变得尤为重要......