CF-gym-102861-A(確率DP)

題名

N枚のカードを購入したいのですが、A枚以上B枚以下のカードパックがあります。
販売する予定のカードパックの数を尋ねると、少なくともN枚のカードを入手できます。
1 <= N <= 1e6
0 <= A <= B <= 1e6
B> 0

分析

カードパックがリリースされるという期待を(A + B)/ 2と見なすのは正しくありません。

別の観点から、x枚のカードを抽出するために必要なカードパックの数がdp [x]
dp [x] =(dp [x-A] + dp [x-A + 1] +…+ dp [x-B])であると仮定します。 /(B-A + 1)+1
はすべての期待値を直接計算できます

ただし、A = 0の場合、方程式の両辺にはdp [x]が含まれますが、その正確性には影響しません。方程式を解くだけです。

コード

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e6 + 5;

double dp[maxn], pre[maxn];

int main(){
    
    
	int n, l, r;
	cin >> n >> l >> r;

	dp[0] = 1; pre[0] = 1;
	if(l == 0){
    
    
		for(int i = 1 ; i <= n ; i++){
    
    
			dp[i] = (pre[max(0,i - l - 1)] - pre[max(0, i - r - 1)] + r - l + 1) / (r - l) ;
			pre[i] = pre[i - 1] + dp[i];
		}
	}
	else{
    
    
		for(int i = 1 ; i <= l ; i++)dp[i] = 1, pre[i] = pre[i - 1] + dp[i];
		for(int i = l + 1 ; i <= n ; i++){
    
    
			dp[i] = (pre[i - l] - pre[max(0, i - r - 1)]) / ( r - l + 1 ) + 1;
			pre[i] = pre[i - 1] + dp[i];
		}
	}
	printf("%.5f",dp[n]);
}

おすすめ

転載: blog.csdn.net/qq_35068676/article/details/110132906