首页 > 其他分享 >洛谷P4550 收集邮票 题解 期望DP

洛谷P4550 收集邮票 题解 期望DP

时间:2024-09-18 14:24:06浏览次数:3  
标签:邮票 frac 花费 题解 P4550 int 洛谷 倒数第

题目链接:https://www.luogu.com.cn/problem/P4550

解题思路:

定义状态 \(f_i\) 表示目前已经取到 \(i\) 种邮票的情况下,取完所有 \(n\)

很明显,\(f_n = 0\),因为此时已经取完了 \(n\)

如果当前已经取到了 \(i\)

  • 有 \(\frac{i}{n}\) 的概率取到现有的邮票(此时仍然拥有 \(i\)
  • 有 \(1 - \frac{i}{n}\) 的概率取到没有的邮票(此时拥有了 \(i+1\)

所以,当 \(i \lt n\)

\[f_i = \frac{i}{n} f_i + (1 - \frac{i}{n}) f_{i+1} + 1 \]

(多出来的 \(1\)

化简得到:

\(\frac{n-i}{n} f_i = \frac{n-i}{n} f_{i+1} + 1\)

\(\rightarrow\)

当 \(i \lt n\)

\[f_i = f_{i+1} + \frac{n}{n-i} \]

定义状态 \(g_i\) 表示目前已经取到 \(i\) 种邮票的情况下,取完所有 \(n\)

"第 \(k\) 次取的花费为 \(k\)"。\(\Rightarrow\) 但是这么分析会很麻烦,我们可以把问题转换为 "倒数第 \(k\) 次取的花费为 \(k\)"

这两句话其实是等价的:

因为假设取 \(m\)

  • 按照 "第 \(k\) 次取的花费为 \(k\)" 总的花费为 \(1 + 2 + 3 + \ldots + m = \sum\limits_{i=1}^m i\);
  • 按照 “倒数第 \(k\) 次取的花费为 \(k\)” 总的花费为 \(m + (m-1) + (m-2) + \ldots + 2 + 1 = \sum\limits_{i=1}^m i\)$。

但是按照这样分析,接下来解决起来会好理解很多。这也是我在看 洛谷上的题解 的时候(我感觉)前几篇题解没有讲的很清楚的地方 后几篇的题解我没看

而取到 \(i\) 种不同的邮票的期望次数是 \(f_i\) 次,所以在拥有 \(i\) 种不同邮票的情况下,要取完 \(n\) 种邮票的期望次数是 \(f_i\)

  • 此时如果取到的是一张现有的邮票,则我还有 \(f_i\) 次要取,我这次的期望取的次数是倒数第 \(f_i + 1\) 次,花费为 \(f_i + 1\);
  • 此时如果取到的是一张新的邮票,则我还有 \(f_{i+1}\) 次要取,我这次的期望取的次数是倒数第 \(f_{i+1} + 1\) 次,花费为 \(f_{i+1} + 1\)

此时我:

  • 有 \(\frac{i}{n}\) 的概率取到现有的邮票(此时仍然拥有 \(i\)
  • 有 \(1 - \frac{i}{n}\) 的概率取到没有的邮票(此时拥有了 \(i+1\)

所以,当 \(i \lt n\)

\[g_i = \frac{i}{n} (g_i + f_i + 1) + (1 - \frac{i}{n}) (g_{i+1} + f_{i+1} + 1) \]

化简得到:

\(\frac{n-i}{n} g_i = \frac{i}{n} (f_i + 1) + \frac{n-i}{n} (g_{i+1} + f_{i+1} + 1)\)

\(\Rightarrow\)

\[g_i = g_{i+1} + f_{i+1} + 1 + \frac{i}{n-i} (f_i + 1) \]

最终的答案为 \(g_0\)。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 5;
double f[maxn], g[maxn];
int n;

int main() {
    cin >> n;
    for (int i = n-1; i >= 0; i--)
        f[i] = f[i+1] + 1. * n / (n - i),
        g[i] = g[i+1] + f[i+1] + 1 + 1. * i / (n - i) * (f[i] + 1);
    printf("%.2lf\n", g[0]);
    return 0;
}



标签:邮票,frac,花费,题解,P4550,int,洛谷,倒数第
From: https://blog.51cto.com/u_13536312/12045940

相关文章

  • 2024 CCPC 网赛题解
    G最大流#include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#defineMAXN205#defineINF0x3f3f3f3f3f3f3f3f#defineLLlonglong#defineIntregisterintusingnamespacestd;inlinevo......
  • 洛阳师范学院 ACM实验室 中秋娱乐赛“月饼代码大逃杀”题解
    题解包括C和C++两种语言_壹我要洋人死!1、直接输出即可C语言题解:#include<stdio.h>intmain(){printf("woyaoyangrensi!");return0;}C++语言题解:#include<iostream>usingnamespacestd;intmain(){ printf("woyaoyangrensi!"); return0;}......
  • P11072 Alice and Bob 题解
    简单博弈题。先说结论,如果存在\(a_i=0\)使得\(1\lei\lea_1\)的话,那么先手必胜,否则后手必胜。若满足上述条件显然先手必胜,将\(0\)搞到第一个就行。否则Alice每操作一次,如果操作后满足了上述条件,那么Bob赢,否则Bob只要不动就行。但是下一轮Alice必须动,要不然两......
  • 【洛谷 P1048】[NOIP2005 普及组] 采药 题解(动态规划+01背包)
    [NOIP2005普及组]采药题目描述辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株......
  • 历年CSP-J初赛真题解析 | 2019年CSP-J初赛阅读程序(16-33)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客#include<cstdio>#include<cstring>usingnamespacestd;charst[100];intmain(){scanf("%s",st);intn......
  • 【架构设计】多级缓存:应用案例与问题解决策略
    【架构设计】多级缓存:应用案例与问题解决策略多级缓存系统的工作原理及其在提升应用性能方面的关键作用。通过对比本地缓存与分布式缓存的特点| 原创作者/编辑:凯哥Java                    | 分类:架构设计系列教程多级缓存系统:提升性能的......
  • 洛谷P1033
    题目传送门:P1033[NOIP2002提高组]自由落体-洛谷|计算机科学教育新生态(luogu.com.cn)题目描述在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,⋯ ,n−1。在地面上有一个小车(长为 L,高为 K,距原点距离为 S1)。已知小球下落距离计算公式为 d=0.5×g×......
  • 洛谷P1016
    题目传送门:传送门p1016题目描述一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 D1D1​、汽车油箱的容量 CC(以升为单位)、每升汽油能行驶的距离 D2D2​、出发点每升汽油价格PP和沿途油站数 NN(NN 可以为零),油站 ii......
  • 【架构设计】多级缓存:应用案例与问题解决策略
      【架构设计】多级缓存:应用案例与问题解决策略 多级缓存系统的工作原理及其在提升应用性能方面的关键作用。通过对比本地缓存与分布式缓存的特点 | 原创作者/编辑:凯哥Java                    | 分类:架构设计系列教程 ......
  • 题解 CF993E 【Nikita and Order Statistics】
    初看这道题,以为又是什么数据结构数数题,没啥思路,结果推式子时搞出了一个类似可以卷积的玩意儿,所以果断\(FFT\)解决。那我们来分析问题:这道题里,值域没用,每一个数只要管它与\(x\)的相对大小关系即可。如果它小于\(x\)那么有贡献,赋值为一,否则为零。然后,可以求前缀和,区间部分......