1. 程式人生 > >牛客21天刷題_day#3

牛客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))