牛客21天刷题_day#3
Contents
1.好多鱼
题目
牛牛有一个鱼缸。鱼缸里面已经有n条鱼,每条鱼的大小为fishSize[i] (1 ≤ i ≤ n,均为正整数),牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸内存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼B大小的2倍到10倍(包括2倍大小和10倍大小),鱼A会吃掉鱼B。考虑到这个,牛牛要放入的鱼就需要保证:
- 放进去的鱼是安全的,不会被其他鱼吃掉
- 这条鱼放进去也不能吃掉其他鱼 鱼缸里面已经存在的鱼已经相处了很久,不考虑他们互相捕食。放入的新鱼之间也不会相互捕食。现在知道新放入鱼的大小范围[minSize,maxSize](考虑鱼的大小都是整数表示),牛牛想知道有多少种大小的鱼可以放入这个鱼缸。
-
输入描述:
- 输入数据包括3行. 第一行为新放入鱼的尺寸范围minSize,maxSize(1 ≤ minSize,maxSize ≤ 1000),以空格分隔。
- 第二行为鱼缸里面已经有鱼的数量n(1 ≤ n ≤ 50)
- 第三行为已经有的鱼的大小fishSize[i](1 ≤ fishSize[i] ≤ 1000),以空格分隔。
-
输出描述:
- 输出有多少种大小的鱼可以放入这个鱼缸。考虑鱼的大小都是整数表示
-
示例
输入
1 12 1 1
输出
3
解释
可以放入大小为1,11,12的鱼,一共3种
思路和解答
- 思路
题目有点啰嗦...简化一下:
-
已知
新的鱼的大小范围;旧的鱼的数目(这个好像没用);旧的每一个鱼的大小 -
求
使得新鱼和旧鱼不会互相吃的新鱼种类数。这个条件是:新鱼和旧鱼的大小差别不在[2,10]倍范围
for i in range(2,1):#如果下限大于上限,那么直接得到空list print (i)#没有任何输出
for i in range(2,1,-1):#如果指定步长是-1,那么就可以倒序遍历 print (i)type(range(2,1,-1))
2range
test=input('请输入')
请输入dsfas
test
'dsfas'
#我考虑的太简单,不能只考虑最大和最小,要考虑中间的一些值,例如这里的64new_range,old_num,old_list='1 1000','13','2 2 2 2 8 8 8 8 64 64 64 64 1000'#多个变量赋值只可以这样写new_min=int(new_range.split(' ')[0])new_max=int(new_range.split(' ')[1])old_list=old_list.split(' ')for i in range(len(old_list)): old_list[i]=int(old_list[i])print (old_list)old_max=max(old_list)old_min=min(old_list)print (old_max,old_min)a=set(range(new_min,int(old_min/10)+1))b=set(range(10*old_max+1,new_max+1))c=set(range(int(old_max/2)+1,2*old_max))d=set(range(new_min,new_max+1))#print(a,b,c,d)len(a.union(b).union(c).intersection(d))
[2, 2, 2, 2, 8, 8, 8, 8, 64, 64, 64, 64, 1000]1000 2500
看了一下解答,还是要一个一个数字去遍历,满足一个结果加1一次,简单的采用不等式的方法,无法覆盖所有case;所以我这样做算是有点走偏了...
- 解答
new_range=input()old_num=int(input())old_list=input().split(' ')new_min=int(new_range.split(' ')[0])new_max=int(new_range.split(' ')[1])count=0for k in range(len(old_list)): old_list[k]=int(old_list[k])#print (new_min,new_max)for i in range(new_min,new_max+1): flag=1 for j in range(len(old_list)): if ((i>=old_list[j]*2 and i<=old_list[j]*10) or (i*2<=old_list[j] and 10*i>=old_list[j])): flag=0#只要一次置为0,那么之后即使不满足if,还是0 if flag: count+=1print (count)
2.表达式求值
题目
今天上课,老师教了小易怎么计算加法和乘法,乘法的优先级大于加法,但是如果一个运算加了括号,那么它的优先级是最高的。例如:
1 2 3 41+23=7 1(2+3)=5
123=6 (1+2)3=9 现在小易希望你帮他计算给定3个数a,b,c,在它们中间添加"+", "", "(", ")"符号,能够获得的最大值。解答
abc=input().split(' ')a=int(abc[0])b=int(abc[1])c=int(abc[2])print (max(a+b*c,a*(b+c),a*b*c,a*b+c,(a+b)*c,a+b+c))