2016级算法第五次上机-G.ModricWang的撒币游戏
1062 ModricWang的撒币游戏
思路
此题为2017年ACM-ICPC亚洲区域赛乌鲁木齐赛区的A题,现场94个队中有38个队做出此题。在这里作为满分以外的题,是为了让大家看一下外面一些题的风格,不要被三位助教的出题风格所局限。
此题首先需要知道一些高中数学概率论的知识。扔起N个硬币,如果每个硬币下落时,正反面朝上的概率都是确定的,那么这些硬币中正面朝上的数量是呈二项分布的。
考虑使用DP,\(prob[i][j]\) 表示扔了第i次后,有j个硬币正面朝上的概率。首先根据题设,\(prob[0][0]=1\),每次根据\(i\)这一行来推出\(i+1\)这一行,扔硬币的过程会让\(prob[i][j]\) 以二项分布分散到\(prob[i+1][p]和prob[i+1][p+k]\) 这\(k+1\) 项里。j、p和n的关系如下:\(p \leq j \leq p+k \leq n\) ,意义为:j表示当前有多少个硬币向上,p表示下一步最少有多少个硬币向上,(p+k)表示下一步最多有多少个硬币向上。所谓的最优策略就是,让p尽量的大,也就是扔硬币的时候尽量选朝下的扔。最终答案就是 \(\Sigma_{i=1}^{n} i*prob[m][i]\)。
具体进行操作时可以有一些优化策略,例如
- 使用滚动数组来节省空间
- 忽略概率小于\(1e-3\) 的项
但是我做的时候没有采取这些策略,因为
- 根据计算,内存空间是足够的
- 虽然\(O(Tnmk)\) 在此题中达到了\(1e9\)的数量级,但是计算过程中的核心语句是\(a+=b*c\) 的形式,这样的语句在X86架构下就是一条FMA指令的事,不必担心常数的问题。 reference: 乘积累加运算 - 维基百科
and FMA指令集 - 维基百科
时间复杂度:\(O(Tnmk)\),空间复杂度\(O(nm)\)
代码:
#include <iostream>
#include <iomanip>
#include <cstring>
using std::ios_base;
using std::cin;
using std::cout;
using std::min;
using std::fixed;
using std::setprecision;
const int MaxNum = 100 + 7;
double prob[MaxNum][MaxNum];
double binomial_distribution[MaxNum][MaxNum];
//计算二项分布的概率值
void get_binomial_distribution() {
double prob_sum = 1;
for (int i = 1; i < MaxNum; i++) {
double C = 1;
prob_sum *= 2;
binomial_distribution[i][0] = C/prob_sum;
for (int j = 1; j <= i; j++) {
C = C*(i - j + 1)/j;
binomial_distribution[i][j] = C/prob_sum;
}
}
}
int main() {
#ifdef ONLINE_JUDGE
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
#else
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
get_binomial_distribution();
int T;
while (cin >> T) {
while (T--) {
int n, m, k;
cin >> n >> m >> k;
memset(prob, 0, sizeof(prob));
prob[0][0] = 1;
for (int step = 1; step <= m; step++) {
for (int i = 0; i <= n; i++) {
int begin_pos = min(i, n - k); //这就是思路里写的p
for (int j = 0; j <= k; j++) {
prob[step][begin_pos + j] += prob[step - 1][i]*binomial_distribution[k][j]; //DP过程
}
}
}
double ans = 0;
for (int i = 1; i <= n; i++) {
ans += i*prob[m][i];
}
cout << fixed << setprecision(3) << ans << "\n";
}
}
}
2016级算法第五次上机-G.ModricWang的撒币游戏的更多相关文章
- 2016级算法第五次上机-F.ModricWang的水系法术
1066 ModricWang的水系法术 思路 比较典型的最大流问题,需要注意的是,题目已经暗示(明示)了这里的边是双向的,在建图的时候需要加上反向边的容量值. 解决最大流问题的基本思路就是不断在残量 ...
- 2016级算法第六次上机-G.ModricWang likes geometry
1116 ModricWang likes geometry 思路 难题,非常考察几何知识,放在这里作为计算几何场次的最难的题. 原题地址 原版题解 代码
- 2016级算法第四次上机-G.ModricWang的序列问题 II
1021 ModricWang的序列问题II 思路 此题与上一题区别不是很大,只是增加了一个长度限制,当场通过的人数就少了很多. 大体解题过程与上一题相同.区别在于对\(f[]\) 的操作.没有长度限 ...
- 2016级算法第五次上机-E.AlvinZH的学霸养成记IV
1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的 ...
- 2016级算法第五次上机-C.Bamboo和"Coco"
1064 Bamboo和"Coco" 分析题意 每个亡灵至少一个花瓣,相邻的亡灵中思念值高的要获得的花瓣高(思念值相等是不需要花瓣一样多的).主要考贪心思路,为了使得花瓣总量最少, ...
- 2016级算法第五次上机-B.Bamboo&APTX4844魔发药水
Bamboo&APTX4844魔发药水 题意 "于是,Bamboo耐着性子,看巫师从袖子里掏出 M 瓶时光泉水和 K 粒绿色能量.每瓶时光泉水重量为 c ,生发效果为 l:每粒绿色能 ...
- 2016级算法第三次上机-G.Winter is coming
904 Winter is coming 思路 难题.首先简化问题, \(n\) 个0与 \(m\) 个1排成一列,连续的0不能超过x个,连续的1不能超过y个,求排列方法数. 显然会想到这是动态规划. ...
- 2016级算法第五次上机-A.Beihang Collegiate Pronunciation Contest 2017
1065 Beihang Collegiate Pronunciation Contest 2017 思路 在字符串中不断做匹配 找到一个匹配就输出 时间复杂度\(O(n)\) ps.模式串是定长的, ...
- 2016级算法第五次上机-D.AlvinZH的学霸养成记III
850 AlvinZH的学霸养成记III 思路 难题.概率DP. 第一种思考方式:直接DP dp[i]:从已经有i个学霸到所有人变成学霸的期望. 那么答案为dp[1],需要从后往前逆推.对于某一天,有 ...
随机推荐
- file_get_contents无法请求https连接的解决方法 php开启curl
file_get_contents无法请求https连接的解决方法 方法1: PHP.ini默认配置下,用file_get_contents读取https的链接,就会如下错误: Warning: fo ...
- 从HiveQL到MapReduce job过程简析
一.简述 HiveQL是一种声明式语言,用户提交查询,而Hive会将其转换成MapReduce job,如下图.一般来说大部分时间可以无视这个执行过程的内部逻辑,但是如果能了解这些底层实现细节,在调优 ...
- SQL 数据库 学习 006 如何设置一个用户名和密码
我的电脑系统: Windows 10 64位 使用的SQL Server软件: SQL Server 2014 Express 先启动 SQL Server 2014 Management Studi ...
- C#在控制台输出异常所在的行数
对于异常,我们经常用try-catch语句来处理,一种常见的方式是在catch语句块用MessageBox.Show("异常")这种弹窗的方式来报告异常.但是有些时候,有些异常发生 ...
- AutoComplete的extraParams动态传递参数
AutoComplete可利用extraParams传递参数,如 extraParams:{para1:'参数1',para2:'参数2'} 但是,如需动态取值作为参数值时却无法达到期望目的,可改为配 ...
- 常用工具类——StringUtils
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreem ...
- 在Linux上编译Hadoop-2.4.0
目录 目录 1 1. 前言 1 2. 安装依赖 1 2.1. 安装ProtocolBuffer 2 2.2. 安装CMake 2 2.3. 安装JDK 2 2.4. 安装Maven 3 3. 编译Ha ...
- EF6 CodeFisrt支持Oracle
EF6 CodeFisrt支持Oracle EF说是支持多数据库,但真做起来太多坑了,编程这个词以后要换换,叫填坑好了.这次把我在做EF6 CodeFisrt支持Oracle数据库过程中遇到的坑写下来 ...
- Gym - 100989H (贪心)
After the data structures exam, students lined up in the cafeteria to have a drink and chat about ho ...
- LightOJ 1098(均值不等式,整除分块玄学优化)
We all know that any integer number n is divisible by 1 and n. That is why these two numbers are not ...