1. 程式人生 > >HDU 5984(求木棒切割期望 數學)

HDU 5984(求木棒切割期望 數學)

長度 std put pri hdu art \n 技術 open

題意是給定一長為 L 的木棒,每次任意切去一部分直到剩余部分的長度不超過 D,求切割次數的期望。

若木棒初始長度不超過 D,則期望是 0.000000;

設切割長度為 X 的木棒切割次數的期望是 F(X).

則 F(X) = F(切割點位置為 0 ~ D) + F(切割點位置為 D ~ X ) + 1;(此處的 +1 是指首次切割產生的次數)

而 F(切割點位置為 0 ~ D ) = 0;(因為已無需再切割)

令下一次切割點的位置為 T,

F(切割點位置為 D ~ X ) = 在D~X上積分 ( 1 / X ) * F( T ) dT ;(在長度為 X 的木棒上選擇到任何一點切割的概率為 1 / X)

F( X ) = F(切割點位置為 0 ~ D) + F(切割點位置為 D ~ X ) + 1 = 0 + 在D~X上積分 ( 1 / X ) * F( T ) dT + 1

兩邊求導:F‘( X ) = - ( 1 / X² ) * ∫ F( T ) dT + F( X ) / X;(積分區間均為 D ~ X)

又: F( X ) = ∫ ( 1 / X ) * F( T ) dT + 1

得: - ( 1 / X² ) * ∫ F( T ) dT = ∫ ( 1 / X ) * F( T ) dT / ( -1 / X ) = ( F(X) - 1 ) / ( -1 / X )

則: F’( X ) = - ( 1 / X² ) * ∫ F( T ) dT + F( X ) / X = ( F(X) - 1 ) / ( -1 / X ) + F( X ) / X = 1 / X

即: F( X ) = ln( X ) + C ( C為常數 )

由 F( D ) = 1,得:C = 1 - ln( D )

得:F( L ) = ln( L ) + 1 - ln( D ) = log( L / D ) + 1.

代碼如下:

技術分享圖片
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int t;
 6     double l,d;
 7     scanf("%d",&t);
 8     while(t--)
 9     {
10 scanf("%lf%lf",&l,&d); 11 if(l<=d) puts("0.000000"); 12 else printf("%.6lf\n",log(l/d)+1); 13 } 14 return 0; 15 }
View Code

感謝這些博客的作者:

https://blog.csdn.net/jay__bryant/article/details/81188557

https://blog.csdn.net/blue_skyrim/article/details/53262572

https://www.cnblogs.com/Yumesenya/p/7657820.html

HDU 5984(求木棒切割期望 數學)