BZOJ3029 守衛者的挑戰

2021-07-25 14:55:02 字數 1281 閱讀 9685

第一行三個整數n,l,k。

第二行n個實數,第i個實數pi表示第i項挑戰成功的百分比。

第三行n個整數,第i個整數ai表示第i項挑戰的屬性值.

乙個整數,表示所求概率,四捨五入保留6 位小數。

樣例輸入1

3 1 0

10 20 30

-1 -1 2

樣例輸入2

5 1 2

36 44 13 83 63

-1 2 -1 2 1

樣例輸出1

0.300000

樣例輸出2

0.980387

若第三項挑戰成功,如果前兩場中某場勝利,隊員們就有空間來容納得到的地圖殘片,如果挑戰失敗,根本就沒有獲得地圖殘片,不用考慮是否能裝下;若第三項挑戰失敗,如果前兩場有勝利,沒有包來裝地圖殘片,如果前兩場都失敗,不滿足至少挑戰成功次()的要求。因此所求概率就是第三場挑戰獲勝的概率。

對於 100% 的資料,保證0<=k<=2000,0<=n<=200,-1<=ai<=1000,0<=l<=n,0<=pi<=100。

期望dp

其實最後只要∑a[i]>=0即可

dp(i,j,k)表示前i場贏了j場 當前得到的權值為k的概率

考慮a[i]>=-1的限制 如果k>n和k=n其實等價

那麼可以很方便地轉移了

#include #define dp( i, j, k ) f[ i ][ j ][ k + 200 ]

using namespace std;

const int maxn = 202;

int n, l, k, a[maxn];

double f[maxn][maxn][maxn<<1], p[maxn], ans;

int main()

for( int i = 1 ; i <= n ; i++ ) scanf( "%d", &a[ i ] );

if( k > n ) k = n;

dp( 0, 0, k ) = 1;

for( int i = 0 ; i < n ; i++ )

for( int j = 0 ; j <= i ; j++ )

for( int k = -i ; k <= n ; k++ )

for( int i = l ; i <= n ; i++ )

for( int j = 0 ; j <= n ; j++ )

ans += dp( n, i, j );

return printf( "%.6lf\n", ans ), 0;

}

bzoj3029 守衛者的挑戰

題目 題目描述 監獄的所在地。突然,眼前一道亮光閃過。我,nizem,是黑魔法聖殿的守衛者。如果你 能通過我的挑戰,那麼你可以帶走黑魔法聖殿的地圖 瞬間,隊員們被傳送到了乙個擂 台上,最初身邊有乙個容量為 k 的包包。擂台賽一共有 n 項挑戰,各項挑戰依次進行。第i 項挑戰有乙個屬性 ai 如果ai...

bzoj 3029 守衛者的挑戰 概率dp

有n個位置,每個位置有乙個權值ai,若ai 0則ai必為 1,且有pi的概率獲得這個值。初始值為k。現在問至少獲得了l個值且獲得的值的和不小於0的概率。n 200,l n,ai,k 2000 設f i,j,k 表示到第i個位置,拿了j個值,當前和為k的概率。顯然若當前的值大於n的話就一定可以滿足和不...

BZOJ3029 守衛者的挑戰 期望DP

time limit 2 sec memory limit 128 mb submit status discuss 的地圖殘片。地圖殘片必須裝在包包裡才能帶出擂台,包包沒有必要全部裝滿,但是隊員們必須把 獲得的所有的 地圖殘片都帶走 沒有得到的不用考慮,只需要完成所有n項挑戰後揹包容量足夠容納地圖...