牛客21天刷题_day#3

牛客21天刷题_day#3

Contents

1.好多鱼

题目

牛牛有一个鱼缸。鱼缸里面已经有n条鱼,每条鱼的大小为fishSize[i] (1 ≤ i ≤ n,均为正整数),牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸内存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼B大小的2倍到10倍(包括2倍大小和10倍大小),鱼A会吃掉鱼B。考虑到这个,牛牛要放入的鱼就需要保证:

  1. 放进去的鱼是安全的,不会被其他鱼吃掉
  2. 这条鱼放进去也不能吃掉其他鱼
    鱼缸里面已经存在的鱼已经相处了很久,不考虑他们互相捕食。放入的新鱼之间也不会相互捕食。现在知道新放入鱼的大小范围[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))
2





range
test=input('请输入')
请输入dsfas
test
'dsfas'
#我考虑的太简单,不能只考虑最大和最小,要考虑中间的一些值,例如这里的64
new_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 2





500

看了一下解答,还是要一个一个数字去遍历,满足一个结果加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=0
for 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+=1
print (count)

2.表达式求值

题目

今天上课,老师教了小易怎么计算加法和乘法,乘法的优先级大于加法,但是如果一个运算加了括号,那么它的优先级是最高的。例如:
1
2
3
4

1+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))
posted @ 2018-10-18 19:51  Howfar's  阅读(201)  评论(0编辑  收藏  举报