愛奇藝2018 9 28筆試 散散的樹

2022-09-02 11:51:07 字數 2474 閱讀 5377

輸入:

5 20

4 42 40 26 46

輸出:

36鋸子必須同時砍樹;

從樹頂到鋸子這段距離被砍下來當成木頭,從樹根到鋸子這段距離留下原地。

問鋸子最高可以多高,但其實要剛好使砍下來的木頭的總長為m,其實就只有一種鋸子的高度能滿足。

n,m =

map(

int,

input()

.split())

li =

list

(map

(int

,input()

.split())

)li =

sorted

(li,reverse=

true

)#降序排序0)

#這樣就能砍到最矮的樹

times =

1#倍數

result =

0#已經砍下的木頭的總長

iflen

(li)==2

:#只有一棵樹,但後面加了個0

如上圖所示,以樣例輸入為例。

排降序後,黑色數字就是5顆樹。

紅色數字代表相鄰兩棵樹之間的高度差,藍色數字代表在這個區間內可以砍到幾棵樹。

比如,如果鋸子高度為42,那麼只能鋸下長度為4的木頭,而這樣的木頭只有1根。而如果鋸子高度為40,那麼除了之前鋸下的4*1的木頭,還有2*2的木頭可以鋸下。

黃色數字,說明了這個累加的過程。

由於8<20<50,所以鋸子的高度肯定是在[40,26]這個區間內。

演算法的思想是:

每次迴圈中,考慮鋸子的高度為li[i],那麼此時鋸子能鋸到從li[0]到li[i-1]這幾棵樹(li[i]這棵樹剛好鋸不到),然後算出當前鋸子能砍下的木頭的總長:

1.如果這個總長還是小於m,那麼i++,繼續迴圈。

2.如果這個總長大於等於m,那麼迴圈停止。然後根據當前的i,計算鋸子的高度。具體地來說:使用上一次迴圈i-1用的鋸子所能砍下的樹的總長resultm-result就是剩餘需要砍下來的木頭長度。times就是當前能砍到幾棵樹。

前面的每次迴圈,代表區間[ li[i-1] , li[i] ]的樹都被完全砍掉了。

最後一次迴圈i中,代表區間[ li[i-1] , li[i] ]的樹不是被完全砍掉的。因此用m-result除以times就是當前區間需要砍掉的每根木頭的長度lastlast是可能為小數的,需要注意。

最終結果便是,li[i-1]-last

本來以為自己的**不能處理,有高度相同的樹的這種情況,但是經過測試,發現沒有問題。

因為雖然在兩端相同的區間內,result不會進行累加(因為temp為0),但是最終總會遇到乙個兩端不同的區間,而此時times也進行過了應該做的累加,所以temp = (li[i-1] - li[i]) * times也會得到正確的temp

輸入:

4 846 42 42 42

輸出:

41

愛奇藝 筆試

題目描述 時間限制 1秒 空間限制 32768k 牛牛養了n只奶牛,牛牛想給每只奶牛編號,這樣就可以輕而易舉地分辨它們了。每個奶牛對於數字都有自己的喜好,第i只奶牛想要乙個1和x i 之間的整數 其中包含1和x i 牛牛需要滿足所有奶牛的喜好,請幫助牛牛計算牛牛有多少種給奶牛編號的方法,輸出符合要求...

愛奇藝 筆試刷題

題目描述 牛牛和羊羊非常無聊.他們有n m個共同朋友,他們中有n個是無聊的,m個是不無聊的。每個小時牛牛和羊羊隨機選擇兩個不同的朋友a和b.如果存在多種可能的pair a,b 任意乙個被選到的概率相同。然後牛牛會和朋友a進行交談,羊羊會和朋友b進行交談。在交談之後,如果被選擇的朋友之前不是無聊會變得...

愛奇藝 筆試刷題

題目描述 乙個完整的括號字串定義規則如下 1 空字串是完整的。2 如果s是完整的字串,那麼 s 也是完整的。3 如果s和t是完整的字串,將它們連線起來形成的st也是完整的。例如,和 是完整的括號字串,和 是不完整的括號字串。牛牛有乙個括號字串s,現在需要在其中任意位置盡量少地新增括號,將其轉化為乙個...