LUOGU P1291 [SHOI2002]百事世界杯之旅 (期望dp)
2024-10-02 22:47:16
解题思路
期望$dp$。因为这个是期望步数,所以要倒着推。那么这道题就变得一脸可做了,设$f[i]$表示还有$i$张牌没有收集的期望,那么考虑再抽一张,有$(n-i)/n$的概率抽到抽过的牌,有$i/n$的概率抽到没有抽过的牌。那么转移方程就是: $f[i]=f[i]*\dfrac{(n-i)}{n}+f[i-1]*\dfrac {i}{n}+1 $。但这样是没法继续写的,因为方程两边有同一个未知数,所以移项可得 $f[i]=f[i-1]+\dfrac{n}{i}$。
输出的格式真的6,因为要输出分数,所以要记下来分母和分子,用一个结构体记录,重载一下$+$就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm> using namespace std;
const int MAXN = ;
typedef long long LL; int n,cnt,num;
struct Node{
LL a,b;
Node(LL u=,LL v=) {a=u;b=v;}
friend Node operator+(const Node A,const Node B){
Node ret;ret.a=ret.b=;
ret.a=A.a*B.b+A.b*B.a;
ret.b=A.b*B.b;
LL gcd=__gcd(ret.a,ret.b);
ret.a/=gcd;ret.b/=gcd;
return ret;
}
}f[MAXN]; //f[i]=f[i-1]*i/n+f[i]*(n-i)/n+1
//f[i]=f[i-1]+n/i int main(){
cin>>n;
for(int i=;i<=n;i++)
f[i]=f[i-]+Node(n,i);
if(f[n].b==) printf("%lld",f[n].a);
else{
LL now=f[n].a/f[n].b;
LL fuck=now;
while(fuck) {cnt++;fuck/=;}
for(int i=;i<=cnt;i++) putchar(' ');
printf("%lld\n",f[n].a-now*f[n].b);
if(now) printf("%lld",now);
LL shit=f[n].b;
while(shit) {num++;shit/=;}
for(int i=;i<=num;i++) putchar('-');putchar('\n');
// printf("-\n");
for(int i=;i<=cnt;i++) putchar(' ');
printf("%lld\n",f[n].b);
}
return ;
}
最新文章
- ubuntu中pycharm安装激活第二种方法的密钥
- ToolTipController 事件触发显示时 避免闪烁的处理方法
- Java判断访问设备为手机、微信、PC工具类
- 解密程序代写,订制服务qq:928900200
- 【bug】Unable to execute dex: Multiple dex files define
- Linux下简单的取点阵字模程序
- 第七届蓝桥杯javaB组真题解析-凑算式(第三题)
- php curl 访问 https站点
- java CountDownLatch 使用介绍
- Myeclipse修改设置Default VM Arguments
- Python_Mix*random模块,time模块,sys模块,os模块
- postman+jenkins+newman自动化api接口测试
- 根据访问ip的地区跳转到指定地址
- 恶意代码分析实战-确认EXE什么时候编译的
- JavaScript 浏览器对象模型 (BOM)
- Spring 3.0 AOP 之 AOP 术语 (一)
- Scala 中的构造器
- 获取对象属性值=NPOI EXPORT
- case功能菜单选项
- arduino八段数码管使用