牛客代码刷题记录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) - 2tmpy = 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 -= 1for 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
问题二
- 给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个: 区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [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 = 0for i in range(n):tmp = a[i]l = r = iif tmp == 0:continuewhile l - 1 >= 0 and a[l - 1] >= tmp:l = l - 1while r + 1 < n and a[r + 1] >= tmp:r = r + 1ans= max(ans, tmp * sum(a[l: r + 1]))print(ans)
- continue 语句跳出本次循环,而break跳出整个循环。
continue 语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环,用在while和for循环中。