阿里筆試題目2

2021-10-23 02:01:37 字數 1401 閱讀 9195

問題

小強得到了長度為n的序列,但他只對非常大的數字感興趣,因此隨機選擇這個序列的乙個連續子串行,並求這個序列的最大值,請告訴他這個最大值的期望是多少?

輸入

第一行n表示序列長度接下來一行n個數描述這個序列,n大於等於1小於等於1000000,數字保證是正整數且不超過100000 第二行n個數字表示序列的值

輸出

保留6位小數

輸入示例

312

3

輸出示例

2.333333
題解

解釋:,,,,,為所有子串行,1最大的概率1/6,2最大的概率為2/6,3最大概率3/6,期望14/6

思路:單調棧 + 動態規劃,時間複雜度o(n) 在序列x中,長度為1的子串行有n個,長度為2的子串行有n-1個…長度為n-1的子串行有2個,長度為n的子串行有1個,總的序列數:c = n+(n-1)+…+2+1 = n*(n+1)/2 個,每個出現的概率相同;

考慮以x[i]為結尾的子串行,這些子串行中有兩種情況,一種是最大值為x[i],兩一種是最大值不為x[i];最大值不為x[i]的相當於x[i]沒有加入,可以借助之前的狀態求解;最大值為x[i]的情況只需記錄有多少個。

用單調棧的思路,從大到小存放出現的元素,並記錄值對應的index值。

完整**實現

//#include

#include

#include

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int> pii;

const

int n =

1000006

;double dp[n]

;//dp[i]表示前i個數中的最大值期望

intmain()

int d = m.

empty()

? i +

1: i - m.

top(

).second;

dp[i +1]

=1.0

* t *d / c + dp[i +

1- d]

; res +

= dp[i +1]

; m.

emplace

(t, i);}

printf

("%.6f\n"

, res)

;}

阿里筆試題目

題目描述 乙個 的訂單中包含n 10 n 1 種商品a1,a2,an,每種商品數量分別為a1,a2,an個,記做 ak 0 訂單在倉庫生產過程中,倉庫為了提公升作業效率,會提前對熱門組合商品進行預包裝。假設這n個商品有m 9 m 1 個商品組合,每個組合bomk包含a1,a2,an的數量分別為 bk...

2019阿里筆試題目

輸入 輸出 當場沒有寫出來,所以也不知道其他樣例啥樣子,只好先ac了樣例再說吧 include include using namespace std string str 100 1000 int main else m l i 1 continue l 6 for int i 6 i input...

c c 筆試題目 轉2

一 請填寫bool float,指標變數 與 零值 比較的 if 語句。10分 請寫出 bool flag 與 零值 比較的 if 語句。3分 標準答案 if flag if flag 如下寫法均屬不良風格,不得分。if flag true if flag 1 if flag false if fl...