记录编号 161693 评测结果 AAAAAAAAAA
题目名称 [HNOI 2015]亚瑟王 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 7.432 s
提交时间 2015-05-08 17:59:39 内存使用 0.58 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int SIZEN=250,SIZER=140;
int N,R;
double P[SIZEN],D[SIZEN];
double F[SIZEN][SIZER]={0};
void work(void){
	memset(F,0,sizeof(F));
	F[1][R]=1;
	double ans=0;
	for(int i=2;i<=N;i++){
		for(int j=0;j<=R;j++){
			//F[i][j]:路过i这张牌j次
			//情况1:路过i-1这张牌j次,全程未发动
			F[i][j]+=F[i-1][j]*pow(1-P[i-1],j+0.0);
			//情况2:路过i-1这张牌j+1次,i-1发动一次
			if(j<R) F[i][j]+=F[i-1][j+1]*(1.0-pow(1-P[i-1],j+1.0));
		}
	}
	for(int i=1;i<=N;i++){
		for(int j=0;j<=R;j++){
			ans+=F[i][j]*D[i]*(1.0-pow(1-P[i],j+0.0));
		}
	}
	printf("%.10lf\n",ans);
}
void read(void){
	scanf("%d%d",&N,&R);
	for(int i=1;i<=N;i++){
		scanf("%lf%lf",&P[i],&D[i]);
	}
}
int main(){
	freopen("arthur.in","r",stdin);
	freopen("arthur.out","w",stdout);
	int T;
	scanf("%d",&T);
	while(T--){
		read();
		work();
	}
	return 0;
}