自动取款机

【问题描述】

小沈阳在小品里说过:“人生最痛苦的事情是人死了,钱还没花了”。

于是小宋(80 岁)决定要将所有的储蓄从 ATM 机中取出花光。 小宋忘记了她有多少存款(银行卡密码她是记得的 2333),这个奇怪的 ATM 不支持查询存款余额功能。小宋知道她存款的唯一信息是存款上限是 K 元,这意味着小宋的存款 x 是 0 到 K 之间的随机整数(包括 K)。

每次小宋都可以尝试从 ATM 中拿出一些钱。 如果她要取的 y 元钱不大于她的存款, ATM 将立即给小宋 y 元。 但如果她的存款小于 y,小宋将收到 ATM 的警告。

如果小宋被警告超过 w 次,那么她将被警方带走,作为小偷。小宋希望取钱次数期望最小。

由于小宋聪明,她总是采取最好的策略。

请计算小宋将所有储蓄从自动取款机中取出期望次数最小值是多少,并不得被警方带走。

【输入格式】

每个测试点包含多组测试数据(最多 10 组)每组测试数据包含两个整数 K,和 W

1≤K,W≤2000

【输出格式】

对于每组测试数据输出取钱次数最小的期望值,舍入到小数点后 6 位。

【样例输入】

1 1

4 2

20 3

【样例输出】

1.000000

2.400000

4.523810

然而她并不知道赵本山说了:“人生最最痛苦的事情是人活着呢钱没了”。。。

这是个悲伤的故事。

这个..期望概率dp我很渣,渣的很
我们不知道的是有多少钱到底,但我们可以通过每次取多少钱来改变期望最小步
首先,我们先确定一下状态,f[i][j]表示在【知道】i为上限时,还剩j次的期望,所以从小到大(因为表示的是表示的一个定值嘛跟后面
没关系的,而且这个不管他准不准,这和题目的描述是一样的)
蓝后,for(int v=1;v<=i;v++)
             f[i][j]=Min(f[i][j],(i+1-v)/1.0/(i+1)*f[i-v][j]+v/1.0/(i+1)*f[v-1][j-1]+1.0);
这才一半不到,重要的是,老太太很精每个状态都是最佳的所以他当然以最小的代价来知道当前多少为上限,就算是准确知道,也不过是
用log2 2000的次数来知道我到底有多少,所以知道i时j最多到10就不再改变,也就是说把两千看成10位二进制来一位一位的取再有你看这
些状态都是确定的,和数据无关,所以我们就先泡一遍2000*2000之后就高枕无忧了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 2001
using namespace std;
typedef double D;
D f[MAXN][];
int k,m;
inline D Min(D x,D y){return x<y?x:y;}
int main()
{
//freopen("atm.in","r",stdin);
//freopen("atm.out","w",stdout);
for(int i=;i<=;i++)
for(int j=;j<=;j++)
f[i][j]=1e10;
for(int i=;i<=;i++)
f[][i]=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int v=;v<=i;v++)
f[i][j]=Min(f[i][j],(i+-v)/1.0/(i+)*f[i-v][j]+v/1.0/(i+)*f[v-][j-]+1.0);
while(scanf("%d%d",&k,&m)==)
{
m=<m?:m;
printf("%.6lf\n",f[k][m]);
}
}

NEYC 2017 自动取款机 atm Day6 T1的更多相关文章

  1. 语言模拟ATM自动取款机系统

    C语言实验报告       题目名称:C语言模拟ATM自动取款机系统 C语言模拟实现ATM自动取款机功能:输入密码,余额查询,取款,存款,转账,修改密码,退出功能: 代码实现的功能: 账号及密码输入: ...

  2. [CareerCup] 12.6 Test an ATM 测试一个自动取款机

    12.6 How would you test an ATM in a distributed banking system? 这道题问我们如何来测试一个自动取款机,我们首先要询问下列问题: - 谁来 ...

  3. C#实现ATM自动取款机

    本篇用C#实现ATM自动取款机的一些功能.面临的第一个问题是:如何把与自动取款机相关的有形的.无形的方面抽象出来.大致如下: (1)关于用户帐号的类:Account(2)关于银行数据库的类:BankD ...

  4. 5、原生jdbc链接数据库实例-自动取款机

    ATM自动取款机需求 一.登陆 1.界面要求:服务选择 1.老用户登陆:进入后输入卡号密码登陆 2.新用户开户:开户需要输入身份证号,记录姓名,开户时间.然后机器给出卡号,原始密码:111111. 卡 ...

  5. ATM自动取款机程序感想

    上周四的Java考试,老师并没有我们考暑假给我们布置的样卷的java程序,而是让我们做一个设计ATM的程序,然而这个对于我们来说好难,因为暑假没有学好java,首先基础知识还没有掌握,输入数据一开始都 ...

  6. linux 下用C实现 ATM 自动取款机功能 (进程间通信)

    直接先上图: 项目需求: 主要分为两人大模块: 客户端 .进入时的功能开户.销户.登录.解锁 开户:输入姓名.身份证号.设置密码,如果开户成功,则服务器上保存一个账号信号(一个账号存一个文件,文件名建 ...

  7. 你怎么改造和重新设计一个ATM银行自动取款机

  8. Google Waymo 2017自动驾驶安全技术报告(一)

    2017年10月Google Waymo向美国交通部提交了一份43页的安全报告,报告中详细说明了Waymo如何装备和训练自动驾驶车辆,从而避免驾驶中的一般和意外情况发生.这份报告对Waymo的自动驾驶 ...

  9. NEYC 2017 游记

    day 1:  result:    sum_rank: 11   school_rank:1   水题在你高估的时候就已经不水了   sum:有个快速乘类似快速幂:       int ans=0; ...

随机推荐

  1. 查看ubuntu版本号命令

    1.uname -a 查看内核版本号 2.cat /etc/issue 查看ubuntu版本号 3.sudo lsb_release -a 查看ubuntu版本号

  2. Python爬虫爬取豆瓣电影之数据提取值xpath和lxml模块

    工具:Python 3.6.5.PyCharm开发工具.Windows 10 操作系统.谷歌浏览器 目的:爬取豆瓣电影排行榜中电影的title.链接地址.图片.评价人数.评分等 网址:https:// ...

  3. java元注解(注解在注解上的注解)

    //ElementType.TYPE 给类.接口.枚举上使用 @Target(ElementType.TYPE)//给注解进行注解,表示该注解可以用在什么地方 //@Retention(Retenti ...

  4. 查看sql 作业明细及运行记录

    --查看作业明细及状态 select j.name 'Job名', j.description '描述', j.ENABLED job_enabled, cast(js.last_run_date a ...

  5. sshd 防止暴力破解

  6. 设置socket接收和发送超时的一种方式

    Linux环境设置Socket接收和发送超时: 须如下定义:struct timeval timeout = {3,0};  //设置发送超时setsockopt(socket,SOL_SOCKET, ...

  7. Percona-Tookit工具包之pt-mysql-summary

      Preface       Sometimes we need to collect information of  MySQL server as a report when we first ...

  8. 阿里云ECS下基于Centos7.4安装MySQL5.7.20

     1.首先登录阿里云ECS服务器,如下图所示: 2.卸载MariaDB 说明:CentOS7.x默认安装MariaDB而不是MySQL,而且yum服务器上也移除了MySQL相关的软件包.因为Maria ...

  9. web入门脑图

  10. dell raid配置

    常用查看命令:待有dell裸机环境会详细列出 megacli -LDInfo -Lall -aALL 查raid级别 megacli -AdpAllInfo -aALL 查raid卡信息 megacl ...