愛奇藝 筆試刷題

2021-08-21 11:14:04 字數 1645 閱讀 5765

題目描述:

/**

牛牛和羊羊非常無聊.他們有n + m個共同朋友,他們中有n個是無聊的,m個是不無聊的。

每個小時牛牛和羊羊隨機選擇兩個不同的朋友a和b.

(如果存在多種可能的pair(a, b),任意乙個被選到的概率相同。),

然後牛牛會和朋友a進行交談,羊羊會和朋友b進行交談。

在交談之後,如果被選擇的朋友之前不是無聊會變得無聊。

現在你需要計算讓所有朋友變得無聊所需要的時間的期望值。

輸入描述:

輸入包括兩個整數n 和 m(1 ≤ n, m ≤ 50)

輸出描述:

輸出乙個實數,表示需要時間的期望值,四捨五入保留一位小數。

輸入例子1:

2 1輸出例子1:

1.5*/

思路如下:

概率題(採用記憶化搜尋策略 o(m*n))

f(n,m)表示n個無聊,m個有聊變為全部無聊期望時間

狀態(n, m)的下乙個狀態可能是 (n, m) (n+1, m-1) (n+2, m-2)分別對應概率為p1, p2, p3

f(n, m)=p1*(f(n, m)+1)+p2*(f(n+1, m-1)+1)+p3*(f(n+2, m-2)+1)

total=m+n

p1=(n c 2)/(total c 2)

p2=(n c 1)*(m c 1)/(total c 2)

p3=(m c 2)/(total c 2)

p1+p2+p3=1

簡化公式

(1-p1)*f(n, m)=1+p2*f(n+1, m-1)+p3*f(n+2, m-2)

由於此種情況n>=1 m>=1 p1肯定不為0

p1=n*(n-1)/((n+m)*(n+m-1))

p2=2*m*n/((n+m)*(n+m-1))

p3=m*(m-1)/((n+m)*(n+m-1))

base case:

f(n,0)=0

f(n, 負數)=0

**如下:

#include#include#define max 101

using namespace std;

//標記備忘錄是否有效

bool marked[max][max];

//行為n 列為m memo只記錄n>=1 m>=1的情況

double memo[max][max];

//n在第一次進入就確保》=1,且n只會增加

//m在第一次進入確保》=1,m會減少

double dfs(int n, int m)

double p1, p2, p3;

p1=1.0*n*(n-1)/((n+m)*(n+m-1));

p2=1.0*2*m*n/((n+m)*(n+m-1));

p3=1.0*m*(m-1)/((n+m)*(n+m-1));

memo[n][m]=1.0*(1+p2*dfs(n+1, m-1)+p3*dfs(n+2, m-2))/(1-p1);

marked[n][m]=true;

return memo[n][m];

}int rounddouble(double number)

int main()

愛奇藝 筆試刷題

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

愛奇藝 筆試刷題

題目描述 牛牛選擇了乙個正整數x,然後把它寫在黑板上。然後每一天他會擦掉當前數字的最後一位,直到他擦掉所有數字。在整個過程中,牛牛會把所有在黑板上出現過的數字記錄下來,然後求出他們的總和sum.例如x 509,在黑板上出現過的數字依次是509,50,5,他們的和就是564.牛牛現在給出乙個sum,牛...

愛奇藝 筆試刷題

題目描述 牛牛學習了氣泡排序,並寫下以下氣泡排序的偽 注意牛牛排序的陣列a是從下標0開始的。bubblesort a repeat length a 1 times for every i from 0 to length a 2 if a i a i 1 then swap a i and a i...