列表

详情


NC210481. 筛子游戏

描述

吉吉国王正在玩一款手游,这个手游的规则非常简单。一开始你会得到三个筛子,三个筛子分别有面,也就是说分别可以扔出之间数。
一开始的分数为,每次扔筛子都会扔出三个数,但是这个游戏的特别之处在于每次开局都会给定三个数,如果满足,那么你的分数就会清零,否则你的分数就会加上。现在吉吉国王想知道需要扔多少次才能使得他的分数大于n。

输入描述

一行七个整数分别表示

输出描述

输出大于时的期望步数。如果用表示你输出的答案,表示标准答案,如果就认为答案正确

示例1

输入:

4 2 3 3 2 2 1

输出:

1.3112582781

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 436K, 提交时间: 2022-10-04 20:13:50

#include<bits/stdc++.h>
using namespace std;
int n,k1,k2,k3,a,b,c;
double p0,p[100],s1[110009],s2[110009]; 
int main(){
	cin>>n>>k1>>k2>>k3>>a>>b>>c;
    p0=1.0/k1/k2/k3;
	for(int i=1;i<=k1;i++)for(int j=1;j<=k2;j++)for(int k=1;k<=k3;k++)p[k+i+j]+=p0;
    p[a+b+c]-=p0;
    for(int i=n;i>=0;i--){
        for(int j=3;j<=k1+k2+k3;j++)s1[i]+=s1[i+j]*p[j],s2[i]+=s2[i+j]*p[j];
        s1[i]+=p0,s2[i]+=1;
	}
    printf("%.10lf",s2[0]/(1-s1[0]));
}

上一题