Título
Quiere comprar cartas N. Ahora hay una especie de paquete de cartas, que puede contener al menos cartas A y como máximo cartas B.
Pregunte cuántos paquetes de tarjetas espera vender y podrá obtener al menos N tarjetas.
1 <= N <= 1e6
0 <= A <= B <= 1e6
B> 0
análisis
No es correcto considerar la expectativa de que el paquete de cartas se publique como (A + B) / 2.
Desde otra perspectiva, suponga que el número de paquetes de cartas necesarios para extraer x cartas es dp [x]
dp [x] = (dp [x-A] + dp [x-A + 1] +… + dp [x-B]) / (B-A + 1) + 1
puede calcular directamente todas las expectativas
Pero cuando A = 0, ambos lados de la ecuación contienen dp [x], pero no afecta su corrección, simplemente resuelva la ecuación.
Código
#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]);
}