按權重給小孩分糖果,筆試題。

2021-07-06 01:48:57 字數 1160 閱讀 6891

2015/10/20

***最後乙個筆試題:按權重給小孩分糖果。

n個孩子站成一排,給每個人設定乙個權重(已知)。按照如下的規則分配糖果: 

(1)每個孩子至少分得一顆糖果 

(2)權重較高的孩子,會比他的鄰居獲得更多的糖果。

問:總共最少需要多少顆糖果?請分析演算法思路,以及演算法的時間,空間複雜度是多少。

如權重為:

糖塊為:1+3+2+1=7;

如權重為:

糖塊為:1+2+1+1=5;

這是牛客網上別人給出的演算法,比較好!!!

方法一:

n個權重(陣列a中)不同的孩子隨機排列,進行分配

1、每個孩子分配乙個;b[i]表示第i個孩子的糖果數

2、假設前面i-1個已分配好,現在分配第i個孩子,

如果i權重較大,b[i]增加到比b[i-1]糖果多1,

如果i權重較小,且b[i-1]等於b[i],b[i-1]加1,然後i減1再進行迴圈

3、最後統計b[i]之和。

空間複雜度o(n),最壞情況下,時間複雜度o(n^2),最好情況下,時間複雜度o(n)。

int getmincandys(int a,int n)

//每個小孩預先分一顆糖

for(int i=0;ia[j-1]) && (b[j]<=b[j-1]))

//權重i小於於i-1,在原來基礎上b[j-1]多1,並且進行i--掃瞄

if((a[j]=b[j-1]))

//if(a[j]1)

}}

for(int k=0;k

方法二:

1、先每人發一顆糖;

2、第一遍從前往後掃瞄,滿足相鄰兩個小孩後面的權重大於前面的權重的情況,後面的小孩在前面的小孩的糖果數的基礎上加乙個。

3、第二遍從後往前掃瞄,滿足條件與第一遍掃瞄一樣。這樣兩遍掃瞄下來就可以保證權重高的孩子比相鄰權重低的孩子的糖果多。

時間複雜度是o(n),空間複雜度是o(n)。

int getmincandys(int a,int n)

//每個小孩預先分一顆糖

for(int i=0;ia[j-1])

} //反掃瞄

for( j=n-1;j>1;j--)

{ //權重i小於i-1 ,i-1比i多1

if((a[j]

按權重隨機

以下 為c 語言,變為其他語言也很容易。說明 1.該演算法複雜度為線性,且無需對權重排序。是我想到的最高效的了。private static list weightkey new list private static list weightvaluefloat new list private s...

528 按權重隨機選擇 C

先將數字累加,然後壓入陣列中,由此得到一系列的區間。只要我們產生乙個隨機數,看落在哪個子區間就行了。例如,輸入3,2,5 就表示產生0的可能性佔3份,產生1的可能性佔2份,產生2的可能性佔5份,於是產生乙個陣列 3,5,10 再隨機生成乙個數,落在 0,10 上,判斷該隨機數落在哪個子區間就可以產生...

dedecms 文章按權重排序

參考 但是當我們在dede arclist標籤中使用orderby weight 來排序時,發現文章顯示並沒有起作用。我們在include taglib arclist.lib.php 開啟來看一下 在 的第74 75行,我們發現 isweight預設為n,所以我們在使用orderby weight...