NEYC 2017 自动取款机 atm Day6 T1
【问题描述】
小沈阳在小品里说过:“人生最痛苦的事情是人死了,钱还没花了”。
于是小宋(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的更多相关文章
- 语言模拟ATM自动取款机系统
C语言实验报告 题目名称:C语言模拟ATM自动取款机系统 C语言模拟实现ATM自动取款机功能:输入密码,余额查询,取款,存款,转账,修改密码,退出功能: 代码实现的功能: 账号及密码输入: ...
- [CareerCup] 12.6 Test an ATM 测试一个自动取款机
12.6 How would you test an ATM in a distributed banking system? 这道题问我们如何来测试一个自动取款机,我们首先要询问下列问题: - 谁来 ...
- C#实现ATM自动取款机
本篇用C#实现ATM自动取款机的一些功能.面临的第一个问题是:如何把与自动取款机相关的有形的.无形的方面抽象出来.大致如下: (1)关于用户帐号的类:Account(2)关于银行数据库的类:BankD ...
- 5、原生jdbc链接数据库实例-自动取款机
ATM自动取款机需求 一.登陆 1.界面要求:服务选择 1.老用户登陆:进入后输入卡号密码登陆 2.新用户开户:开户需要输入身份证号,记录姓名,开户时间.然后机器给出卡号,原始密码:111111. 卡 ...
- ATM自动取款机程序感想
上周四的Java考试,老师并没有我们考暑假给我们布置的样卷的java程序,而是让我们做一个设计ATM的程序,然而这个对于我们来说好难,因为暑假没有学好java,首先基础知识还没有掌握,输入数据一开始都 ...
- linux 下用C实现 ATM 自动取款机功能 (进程间通信)
直接先上图: 项目需求: 主要分为两人大模块: 客户端 .进入时的功能开户.销户.登录.解锁 开户:输入姓名.身份证号.设置密码,如果开户成功,则服务器上保存一个账号信号(一个账号存一个文件,文件名建 ...
- 你怎么改造和重新设计一个ATM银行自动取款机
- Google Waymo 2017自动驾驶安全技术报告(一)
2017年10月Google Waymo向美国交通部提交了一份43页的安全报告,报告中详细说明了Waymo如何装备和训练自动驾驶车辆,从而避免驾驶中的一般和意外情况发生.这份报告对Waymo的自动驾驶 ...
- NEYC 2017 游记
day 1: result: sum_rank: 11 school_rank:1 水题在你高估的时候就已经不水了 sum:有个快速乘类似快速幂: int ans=0; ...
随机推荐
- scala映射和元组
scala映射,是一对键值对,相当于java中的Map 对偶:由两个值构成的组,形式 : 值1->值2,值1和值2类型不一定要相同,可以理解为对偶就是一个key/value 映射就是对偶的集合 ...
- linux文件操作篇 (三) 文件状态和操作属性
#include <sys/stat.h> int fstat(int fildes, struct stat *buf); 获取文件信息 int lstat(const char* ...
- 第一天的题目 简单A+B 植树问题 多项式的值
#include<stdio.h> int main() { int a=0;b=0; scanf("%d%d",&a,&b); printf(&quo ...
- python入门——Anaconda安装
初学Python,可以选择python原始的IDE,但原始的IDE在使用过程中需要自己安装各种包,个人觉得初学者不需要将时间花在这些上面,而是应该直接学习python程序,这些比较杂的事情可以在以后的 ...
- 查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)
SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企 ...
- [答网友问]让GridLength支持动画
原文:[答网友问]让GridLength支持动画 [答网友问]WPF中让GridLength类型支持动画 ...
- express操作数据库
Express 首页 入门 使用指南 API 中文手册 进阶话题 有用的资源 集成数据库 为 Express 应用添加连接数据库的能力,只需要加载相应数据库的 Node.js 驱动即可.这里将会简要介 ...
- SharePoint显示错误信息
在SharePoint项目中,一般如果发生错误,SharePoint会弹出它自定义的报错页面,一般就显示"Something went wrong",如果光是看这一句话, ...
- 去掉google play专为手机设计标识
google play上的应用默认都会有个“专为手机设计”的标识 有时应用明明已经针对平板作了优化,但为什么这个标识还在呢,如何去掉这个标识呢,其实只需要两个步骤就好了: 1. 标记为支持高分辨率 & ...
- TortoiseHg 学习笔记一
因项目需要频繁的提交.合并代码,前段时间别人在我笔记本上装了个TortoiseHg,我不怎么会用 现在学习一下,目前没时间写太多东西,未完待续 记录一下查看的文章 http://jingyan.bai ...