百度20230328海笔 - 移动软件研发工程师 暑期实习

30道选择, 两道算法

两套卷子,一套Android,一套iOS
两个都不会,因为iOS接触都没接触过,所以选了Android
选择不说了,没学过Java、Android,啥也不会,有几个关于网络的题勉强选了一下

直接看算法题吧

战斗

时间限制: 3000MS
内存限制: 589824KB

题目描述:
小明是一位战士,某天他在和一个怪物战斗,他有n个技能,使用第i个技能能造成ai点伤害,在m个回合中,
每个回合只能释放一种技能,每种技能总共能释放任意次数,但不能连续释放同一个技能超过k次。请问他在这m回合中最多能造成多少伤害。

输入描述 :
第一行包含三个正整数n、m和k ,分别表示技能数量,回合数和同一个技能最多连续释放次数。
第二行包含n个正整数a1,a2,…,an (1 ≤ ai ≤ 109),其中ai表示第 i 个技能能造成的伤害。 ( 2 ≤ n ≤
50000,1 ≤ m ≤ 109,1 ≤ k ≤ 109 ) 数字间两两有空格隔开 输出描述 输出一个数,表示总共能造成伤害的最大值。

样例输入
4 4 2
4 3 2 1
样例输出
15

提示
可以先连续释放技能1两次,造成8点伤害,此时不能再释放技能1,所以释放技能2一次,造成3点伤害,再释放技能1一次,造成4点伤害,总计造成伤害15点,这是能达到的最大值。

63%的通过率

n, m, k = map(int, input().split())
sh = list(input().split())
sh.sort(reverse=True)

res, cnt = 0, 0
now = int(sh[0])

while m > 0:
    res += now
    cnt += 1
    if cnt == k:
        cnt = 0
        res += int(sh[1])
        m -= 1
    m -= 1
print(res)

旅行者与山峰

时间限制: 3000MS
内存限制: 589824KB

题目描述:
n座山峰横亘在旅行者与目的地之间,阻挡着他的去路,旅行者必须依次经过这n座山峰到达目的地,即,旅行者必须先经过第一座山,再经过第二座,……,最后经过第n座。
山峰的险峻程度可以用险峻值h衡量,第i座山峰的险峻值为hi。同时,旅行者登山的能力可以用能力值k衡量。
经过一座山峰的方式有两种:攀登和绕过。如果旅行者的能力值k不小于山峰的险峻值h,那么旅行者既可以攀登这座山峰,也可以绕过这座山峰;反之,如果旅行者的能力值小于山峰的险峻值,那么旅行者既不能攀登也不能绕过这座山峰。
同时,每座山峰具有一个加成值a,第i座山峰的加成值为ai。如果旅行者选择攀登第i座山峰,那么在攀登结束后,旅行者的能力值将增加ai;如果旅行者选择绕过,则能力值不会获得加成。
给出旅行者的初始能力值k0,n座山峰的险峻值hi和加成值ai(1≤i≤n),求旅行者至少需要攀登几座山峰才能到达目的地。

输入描述:
首先输入一行,包含两个整数n,k0。其中1≤n≤105,表示山峰个数;1≤k0≤109,表示旅行者的初始能力值。
之后输入一行,包含n个整数h1,h2,……,hn,表示各个山峰的险峻值。1≤hi≤109。
最后输入一行,包含n个整数a1,a2,……,an,表示各个山峰的加成值。0≤ai≤109。

输出描述:
输出一行,包含一个整数,表示旅行者为了到达目的地至少需要攀登的山峰个数。如果旅行者无法到达目的地,则输出-1。

样例输入
5 3
3 2 5 4 6
1 2 1 3 0
样例输出
2

样例解释
样例一中,旅行者可以选择攀登第2和第3座山,这样旅行者经过第1至5座山时的能力值分别为:3、3、5、6、6,均不小于各座山的险峻值。

54%的通过率

def isok(l, k):
    for i in range(len(l)):
        if int(l[i]) > k:
            return -1
    return 1


def l11(h1):
    l1 = []
    for i in range(len(h1)):
        if k0 >= int(h1[i]):
            l1.append(i)
    return l1


def rek(k1, h, cnt):
    l1 = l11(h)
    res = l1[0]
    for i in l1:
        res = max(res, int(a[i]))
    k1 += res
    cnt += 1
    return k1, cnt


n, k0 = map(int, input().split())
h = list(input().split())
a = list(input().split())
cnt = 0
for i in range(n):
    k0, cnt = rek(k0, h, cnt)
    res = isok(h, k0)
    if res == 1:
        break
if isok(h, k0) == 1:
    print(cnt)
else:
    print("-1")

——————————————————————————————
下午去了趟医院,回来就只休息了,要是晚上会看算法题的话再写《代码随想路day2》的内容
但估计不会了,身体不舒服还是早点休息比较好,磨刀不误砍柴工嘛

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值