問題
小強得到了長度為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...