博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【2019年乐山师范学院程序设计大赛 --- G. 新21点】DP+前缀和
阅读量:2038 次
发布时间:2019-04-28

本文共 1653 字,大约阅读时间需要 5 分钟。

【2019年乐山师范学院程序设计大赛 --- G. 新21点】DP+前缀和

题目来源:

Description

玩家参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:

以 0 分开始,在得分少于 K 分时抽取数字。 抽取时,从 [1, W] 的范围中随机获得一个整数作为分数进行累计。 每次抽取都是独立的,其结果具有相同的概率。

当获得不少于 K 分时,就停止抽取数字。 求解分数不超过 N 的概率是多少?

Input

输入仅有一行,包括三个整数 N,K,W ( 0 <= K <= N <= 1000, 1 <= W <= 10000 ) 。

Output

输出一个浮点数,请保留 5 位小数,表示分数不超过 N 的概率。

Sample Input

6 1 10

Sample Output

0.60000

Note

如果答案与正确答案的误差不超过 10-5,则该答案将被视为正确答案通过。

解题思路

设f[i]表示得到 i 点分数的概率。那么f[0]=1;

对于第i点分数我们可以先判断我们需要的范围(不是所有的数据我们都要去运算,我们只运算需要的那部分)

  • l=max(0,i-w)到r=min(i-1,k-1)中获取[l,r]区间。

只有[l,r]点分数这个区间才能够通过一次抽取获得i点分数。

所以我们只需将[l,r]点分数的概率之和除以w就可以得到f[i]的概率。

最终的答案就是f[k]+f[k+1]…+f[n];

当然,为了方便我们可以使用一个数组d来存放前缀和,方便运算。

AC代码1:

#include 
using namespace std;#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)#define endl '\n'const int MAXN = 1e4+5;double f[MAXN],d[MAXN];int main(){
int n,k,w; scanf("%d%d%d",&n,&k,&w); if(k==0 || k+w<=n) {
printf("%.5f\n",1); return 0; } f[0]=1; d[0]=1; for(int i=1;i<=n;i++) {
int l=max(0,i-w); int r=min(i-1,k-1); if(l==0) f[i]=d[r]/w; else f[i]=(d[r]-d[l-1])/w; d[i]=d[i-1]+f[i]; } printf("%.5f\n",d[n]-d[k-1]); return 0;}

AC代码2:

#include 
using namespace std;#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)#define endl '\n'const int MAXN = 1e4+5;double dp[MAXN];int main(){
int n,k,w; scanf("%d%d%d",&n,&k,&w); if(k==0 || k+w<=n) {
printf("%.5f\n",1); return 0; } dp[0]=1; double sum=1.0,ans=0.0; for(int i=1;i<=n;i++) {
dp[i]=sum/w; if (i>=w) sum-=dp[i-w]; if(i

转载地址:http://isyof.baihongyu.com/

你可能感兴趣的文章
jedis : NoSuchMethodError: org.springframework.util.Assert.isTrue(ZLjava/util/function/Supplier
查看>>
Redis RedisCluster Spring整合
查看>>
Linux中Swap与Memory内存简单介绍
查看>>
常见JedisConnectionException异常分析
查看>>
linux下常见命令
查看>>
RedisTemplate和StringRedisTemplate的区别
查看>>
maven setting.xml文件设置私服地址
查看>>
Java多线程Future task的使用
查看>>
loadrunner通过注册中心 网关压测spring cloud应用
查看>>
Spring Cloud 异常处理
查看>>
Redis集群性能测试工具redis-benchmark
查看>>
ActiveMQ 数据持久化
查看>>
RocketMQ批量消费、消息重试、消费模式、刷盘方式
查看>>
redis中与清空数据有关的命令
查看>>
redis cluster 一个问题:双master不能在一个虚拟机/物理机上
查看>>
Redis缓冲区设置
查看>>
RocketMQ初步应用架构理论(主从切换/异/同步刷盘)
查看>>
eclipse 修改 项目的git地址
查看>>
Spring gateway使用一个lambda例子的说明
查看>>
Bug: Return value of putIfAbsent is ignored, but list is reused
查看>>