題名
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]);
}