題目描述
題目解析
這題太毒瘤了…尼瑪還可以轉換…
首先,直接dp貌似是不行的(反正我這個LaJi不行),那麼,我們迴歸本質。
神奇的來了,我們不妨設
那麼
那麼
然後
現在就有一個問題,那就是
只發動一次的概率爲:
代碼
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
using namespace std;
#define MAXN 220
#define MAXR 132
#define INF 0x3f3f3f3f
typedef long long int LL;
template<class T>
void Read(T &x){
x=0;char c=getchar();bool flag=0;
while(c<'0'||'9'<c){if(c=='-')flag=1;c=getchar();}
while('0'<=c&&c<='9'){x=x*10+c-'0';c=getchar();}
if(flag)x=-x;
}
int n,r;
long double p[MAXN+10],w[MAXN+10];
long double dp[MAXN+10][MAXR+10];
int main(){
int T;
Read(T);
while(T--){
memset(dp,0,sizeof(dp));
Read(n),Read(r);
for(int i=1;i<=n;++i)cin>>p[i]>>w[i];
dp[0][r]=1;
long double ans=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=r;++j){
dp[i][j]=dp[i-1][j]*pow(1-p[i-1],j)+dp[i-1][j+1]*(1-pow(1-p[i-1],j+1));
ans+=dp[i][j]*(1-pow(1-p[i],j))*w[i];
}
cout<<fixed<<setprecision(10)<<ans<<'\n';
}
}
/*
2
3 2
0.5000 2
0.3000 3
0.9000 1
3 2
0.5000 2
0.3000 3
0.9000 1
*/