概率与期望(题单)

Little Pony and Expected Maximum

题意

一个 m 面的骰子,投 n 次,求预期最大点数的期望值。

题解

首先,投掷的情况一共有 m n m^n mn种。

对于预期最大点数为 i (即 n 次中出现的最大点数是 i )的情况数为 i n − ( i − 1 ) n i^n-(i-1)^n in(i1)n

也就是都有点数都小于等于 i 的情况数减去都有点数都小于等于 (i - 1) 的情况数

因此,最后的期望为

∑ i = 1 m i ∗ ( i n − ( i − 1 ) n ) m n \frac{\sum_{i=1}^{m}i*(i^n-(i-1)^n)}{m^n} mni=1mi(in(i1)n)

化简后可以得到

n − ∑ i = 1 m − 1 ( i n ) m ∗ i n-\sum_{i=1}^{m-1}(\frac{i}{n})^m*i ni=1m1(ni)mi

通过快速幂,线性求出 ( i n ) m (\frac{i}{n})^m (ni)m即可。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const double eps = 1e-6;
 
double n, m;
 
double ksm(double a, ll b) {
	double res = 1.0;
	while (b) {
		if (b & 1)res *= a;
		b >>= 1;
		a = a * a;
 
	}
	return res;
}
 
int main() {
	cin >> m >> n;
	double ans = m;
	for (double i = 1; i <= m - 1; i++) {
		ans -= ksm(i / m, n);
	}
	printf("%.10f", ans);
	return 0;
}

Checkpoints

题意

有 n 个关卡,当该关卡为 1,他是一个关键点,为 0 则不是。

某人想要挑战这 n 个关卡,通过一个关卡的概率是1/2。

若在不是关键点的关卡挑战失败,需要回退到最近的且已经挑战成功的关键点。

已知期望挑战步数,构造符合期望步数的关卡。

题解

emmmmm…就很无语!

我手撸了一下样例,随便下了一个结论,看起来能过样例,就写了,就交了,然后过了,我人傻了。

“只要过了样例,都能交”

后来认真的分析了一下,结论确实是对的。

把一个连续的串1 0 0 0…当做一个关卡,对于 1 来说通过概率是 1/2,对于第 1 个 0 来说,需要通过 1 且通过当前关卡,那么通过概率是 1/4,因此对于第 i 个 0 来说,通过的概率是 1/2^(i+1)。

那么我们就可以知道,对于 1 来说,期望是 2 ,对于 0 来说,期望是 2^(i+1)。由于期望具有可加性,求和就是最后的期望步数。

所以,我们可以知道当期望为奇数时是无解的,偶数一定能构造出由 2^i 构成的数列。

预处理出 2^i 的前缀和,不停取小于等于当前剩余步数的pre 即可。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int T;
ll n, pre[100];

void init() {
	ll res = 2; pre[1] = res;
	for (int i = 2; i <= 64; i++) pre[i] = res * 2 + pre[i - 1], res *= 2;
}

int main() {
	init();
	cin >> T;
	while (T--) {
		cin >> n;
		if (n % 2 == 1)cout << "-1\n";
		else {
			ll ans = n, cnt = 0;
			vector<int>vec;
			while (ans > 0) {
				int pos = lower_bound(pre + 1, pre + 1 + 63, ans) - pre;
				if (pre[pos] == ans)vec.push_back(pos), ans = 0, cnt += pos;
				else vec.push_back(pos - 1), ans -= pre[pos - 1], cnt += pos - 1;
				
			}
			cout << cnt << "\n";
			for (auto x : vec) {
				cout << 1 << ' ';
				for (int i = 1; i < x; i++)cout << 0 << ' ';
			}
			cout << "\n";
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《算法导论(原书第2版)》一书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于多种用途。涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通子图算法正确性的证明,对哈密顿回路和子集求和问的NP完全性的证明等内容。全书提供了900多个练习和思考以及叙述较为详细的实例研究。   《算法导论(原书第2版)》一书内容丰富,对本科生的数据结构课程和研究生的算法课程都是很实用的教材。本书在读者的职业生涯中,也是一本案头的数学参考书或工程实践手册。   在有关算法的书中,有一些叙述非常严谨,但不够全面,另一些涉及了大量的材,但又缺乏严谨性。《算法导论》将严谨性和全面性融为一体。   《算法导论(原书第2版)》一书深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。各章自成体系,可以作为独立的学习元。算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂。说明和解释力求浅显易懂,不失深度和数学严谨性。   《算法导论(原书第2版)》一书自第1版出版以来,已经成为世界范围内广泛使用的大学教材和专业人员的标准参考书。第2版增加了论述算法作用、概率分析与随机算法、线性规划等几章。同时,对第1版的几乎每一节都作了大量的修订。一项巧妙而又重要的修改是提前引入循环不变式,并在全书中用来证明算法的正确性。在不改变数学和分析重点的前提下,作者将许多数学基础知识从第一部分移到了附录中,并在开始部分加入了一些富有诱导性的材。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值