【牛客刷题记录】2021-03-10

牛客代码刷题记录1

问题一
  1. 给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个: 区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值:
    [6] = 6 * 6 = 36;
    [2] = 2 * 2 = 4;
    [1] = 1 * 1 = 1;
    [6,2] = 2 * 8 = 16;
    [2,1] = 1 * 3 = 3;
    [6, 2, 1] = 1 * 9 = 9;
    从上述计算可见选定区间 [6] ,计算值为 36,则程序输出为 36。 区间内的所有数字都在[0, 100]的范围内;

输入输出
  • 输入描述:
    第一行输入点集的个数 N, 接下来 N 行,每行两个数字代表点的 X 轴和 Y 轴。
    对于 50%的数据, 1 <= N <= 10000;
    对于 100%的数据, 1 <= N <= 500000;
  • 输出描述:
    输出“最大的” 点集合, 按照 X 轴从小到大的方式输出,每行两个数字分别代表点的 X 轴和 Y轴。
  • 输入例子1:
    5
    1 2
    5 3
    4 6
    7 5
    9 0
  • 输出例子1:
    4 6
    7 5
    9 0
解决方案:
  • 理解:
    如果x满足P中任意点都不在x的右上方区域内(横纵坐标都大于x),则称其为“最大的”-> 不存在任何点其横纵坐标都大于点x ->
  • 分析:
    1.对所有点x轴进行降序排序,则第一个点一定是最大点
    2.后面的点要想成为最大点,只需其y值大于前面的最大的y值即可
    3.最后倒序输出数组
if __name__ == "__main__":
    n = int(input())
# 二维数组输入方式
    a = []
    for _ in range(n):  # ’_’作用同i,循环标志
        a.append(list(map(int, input().split())))
    a.sort(key=lambda x: x[0])
    j = len(a) - 2
    tmpy = a[-1][1]
    for i in range(len(a) - 1, -1, -1):
        if tmpy < a[i][1]:
            tmpy = a[i][1]
            a[j] = a[i]
            j -= 1
    for k in range(j + 1, len(a)):
        print(a[k][0], a[k][1])

函数/方法

  • n=int(input(“[输入]>”))
    input()返回是一个字符串,int(input())把input()返回的字符串转换成整型,返回的是整型
  • str.split(str="", num=string.count(str)
    #通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串,返回分割后的字符串列表。
    str = “Line1-abcdef \nLine2-abc \nLine4-abcd”;
    print str.split( ); # 默认以空格为分隔符,包含 \n \t
    print str.split(’ ', 1 ); # 以空格为分隔符,分隔成两个
  • map()
    根据提供的函数对指定序列做映射。map(function, iterable, …),第一个参数 function 以参数序列中的每一个元素调用function函数,返回包含每次 function函数返回值的新列表。
    map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数
    [1, 4, 9, 16, 25]
  • list()方法
    list(tuple) 将元组转换为列表。
    注:元组与列表非常类似,区别在于元组的元素值不能修改,元组是放在括号()中,列表是放于方括号[]中。
    aTuple = (123, ‘runoob’, ‘google’, ‘abc’)
    aList = list(aTuple)
    print ("列表元素 : ")
    print(aList)
    列表元素 : [123, ‘runoob’, ‘google’, ‘abc’]
  • list.sort()
    sort(cmp = None ,key = None, reverse = False) 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。没有返回值,但是会对列表的对象进行排序。
    cmp:可选参数, 如果指定了该参数会使用该参数的方法进行排序。
    key:可选参数,主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    reverse:排序规则,reverse = True 降序, reverse = False 升序(默认)。
    list.sorted()有返回值,返回对key值排好序的list
问题二
  1. 给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个: 区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值:
    [6] = 6 * 6 = 36;
    [2] = 2 * 2 = 4;
    [1] = 1 * 1 = 1;
    [6,2] = 2 * 8 = 16;
    [2,1] = 1 * 3 = 3;
    [6, 2, 1] = 1 * 9 = 9;
    从上述计算可见选定区间 [6] ,计算值为 36,则程序输出为 36。 区间内的所有数字都在[0, 100]的范围内;
输入输出
  • 输入描述:
    第一行输入数组序列长度n,第二行输入数组序列。
    对于 50%的数据, 1 <= n <= 10000;
    对于 100%的数据, 1 <= n <= 500000;

  • 输出描述:
    输出数组经过计算后的最大值。

  • 输入例子1:
    3
    6 2 1

  • 输出例子1:
    36

思路

遍历每个数,并找出该数的最大区间,即该数在区间中最小,加总求积

if __name__ == "__main__":
    n = int(input())
    a = list(map(int, input().split()))
    ans = 0
    for i in range(n):
        tmp = a[i]
        l = r = i
        if tmp == 0:
            continue
        while l - 1 >= 0 and a[l - 1] >= tmp:
            l = l - 1
        while r + 1 < n and a[r + 1] >= tmp:
            r = r + 1
        ans= max(ans, tmp * sum(a[l: r + 1]))
    print(ans)
  • continue 语句跳出本次循环,而break跳出整个循环。
    continue 语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环,用在while和for循环中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值