#1489 : Legendary Items

news/2023/12/8 15:53:46
原题链接
时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

Little Hi is playing a video game. Each time he accomplishes a quest in the game, Little Hi has a chance to get a legendary item.

At the beginning the probability is P%. Each time Little Hi accomplishes a quest without getting a legendary item, the probability will go upQ%. Since the probability is getting higher he will get a legendary item eventually.

After getting a legendary item the probability will be reset to ⌊P/(2I)⌋% (⌊x⌋ represents the largest integer no more than x) where I is the number of legendary items he already has. The probability will also go upQ% each time Little Hi accomplishes a quest until he gets another legendary item.

Now Little Hi wants to know the expected number of quests he has to accomplish to get N legendary items.  

Assume P = 50, Q = 75 and N = 2, as the below figure shows the expected number of quests is

2*50%*25% + 3*50%*75%*100% + 3*50%*100%*25% + 4*50%*100%*75%*100% = 3.25

输入

The first line contains three integers P, Q and N.  

1 ≤ N ≤ 106, 0 ≤ P ≤ 100, 1 ≤ Q ≤ 100

输出

Output the expected number of quests rounded to 2 decimal places.

样例输入 50 75 2 样例输出 3.25 解题思路: 参考链接

提示也隐藏在这张图中,我们仔细观察可以发现红圈中的子树和黄圈中的子树一模一样。

这提示我们,无论第一件传说物品是怎么获得的(完成第一件任务就获得还是完成两件任务后获得),第二件传说物品都是从25%概率开始,与第一件无关。换句话说,每件传说物品的获得都是独立的,就好像掷N枚骰子每枚骰子的点数是相互独立的一样。

我们知道如果X和Y是两个独立的随机变量,那么E(X+Y)=E(X)+E(Y)。于是我们可以分别求出获得第一件、第二件……第N件传说物品的期望任务数,再把它们加起来就是最终答案。

我们知道第i件传说物品起始的概率是⌊P/(2i-1)⌋%,为了描述方便把它记作Pi;任务失败后概率增加Q%。用二叉树表示大概是这样:

由于概率不断增加Q%,我们最多完成100个任务就一定能获得第i件传说物品。所以计算第i件传说物品的期望任务数的复杂度是O(100)。一般我们在计算复杂度时是忽略常数的,不过这里100次计算是一个比较大的常数,为了体现这一点我们姑且把这个复杂度记作O(100)。这样计算N件传说物品的总复杂度就是O(100N)的。这个算法已经相当不错了,大概能得到90/100分。

代码如下:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>using namespace std;int main() {//freopen("input.txt","r",stdin);int p,q,n;cin>>p>>q>>n;double res = 0.0;int p1;for(int i = 1; i <= n; i++) {if(i < 8) p1 = floor(p / pow(2,i-1));else p1 = 0;double p2 = 1.0;for(int j = 1; j <= 100; j++) {//路经长度res += p1 / 100.0 * p2 * j;if(p1 == 100) break;p2 *= (1 - p1 / 100.0);p1 = p1 + q;if(p1 > 100) p1 = 100;}}printf("%.2f\n",res);return 0;
}

如果我们进一步分析,会发现虽然我们计算了N棵二叉树对应的期望任务数。但这N棵二叉树总共最多有101种形态。因为Q不变,Pi的值唯一决定了这棵二叉树长什么样子,而Pi一共有0~100共101种取值。所以我们只需预先求出起始概率分别是100%、99%、98% … 0%时的期望任务数,保存在数组f[]里。计算第i件传说物品时,根据Pi直接把相应的f[Pi]累加即可。

值得一提的是,我们可以用倒推的方法求出f[],而不用每次O(100)重新计算。

f[100] = 1;
for(int i = 99; i >= 0; i--) {int j = min(i + Q, 100);  //计算如果这次任务没获得,下一个任务获得的概率//i%的概率1次获得,(1-i%)的概率是从j%起始的期望任务数+1f[i] = i% * 1 + (1-i%) * (f[j] + 1);
}

于是我们得到了一个O(100+N)的算法,比之前的O(100N)好了100倍。

如果我们再进一步分析,我们会发现⌊P/(2i-1)⌋%会很快下降到0。实际上从第8件传说物品开始,起始概率就一定都是0了。也就是说从第8件开始我们可以直接用f[0]*(N-7)算出期望任务数的和。这样我们得到了一个更快的O(100+8)的算法。这个算法对于每组数据只需要常数次计算即可得到答案。

上文中的证明:

假设,其中为路径长度的概率。则有


其中,,所以



代码如下:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>using namespace std;int main() {//freopen("input.txt","r",stdin);int p,q,n;cin>>p>>q>>n;double f[101] = {0};f[100] = 1;for(int i = 99; i >= 0; i--) {int j = min(i+q,100);double pi = i / 100.0;  //计算如果这次任务没获得,下一个任务获得的概率//i%的概率1次获得,(1-i%)的概率是从j%起始的期望任务数+1f[i] = pi + (1 - pi) * (f[j] + 1);}double res = 0;int pi ;for(int i = 1; i <= n; i++) {if(i >= 8) pi = 0;else pi = floor(p / pow(2,i-1));res += f[pi];}printf("%.2f\n",res);return 0;
}


http://www.ppmy.cn/news/422472.html

相关文章

厦大C语言上机 1489 变与不变

1489.变与不变 时间限制: 1000 MS 内存限制: 65536 K 提交数: 494 (0 users) 通过数: 285 (277 users) 问题描述 编写下列函数 void change(int *a,int *b,int flag); 根据flag的值对a、b进行处理。当flag为正数时&#xff0c;对a、b指向的变量求绝对值; 当f…

蓝桥杯2022A组数的拆分题记

先上题干 [蓝桥杯 2022 省 A] 数的拆分 题目描述 给定 T T T 个正整数 a i a_{i} ai​&#xff0c;分别问每个 a i a_{i} ai​ 能否表示为 x 1 y 1 ⋅ x 2 y 2 x_{1}^{y_{1}} \cdot x_{2}^{y_{2}} x1y1​​⋅x2y2​​ 的形式&#xff0c;其中 x 1 , x 2 x_{1}, x_{2} x1​…

题目 1489: 乘法运算

题目 编制一个乘法运算的程序。 从键盘读入2个100以内的正整数&#xff0c;进行乘法运算并以竖式输出。 样例输入 16 8样例输出 168 ━━━ 128816128&#xff0c;则第四行128右侧对准个位输出。计算完成&#xff0c;不再输出。 再例如&#xff1a; 输&#xff1a; 8…

URAL 1489 Points on a Parallelepiped

题意&#xff1a;把一个平面图形转成立体图形&#xff0c;求其中两点的距离。 脑残了&#xff0c; 中间的A&#xff0c;B表示的边看错了。。没有注意边界&#xff0c;没有加EPS。。 改的时候不仔细又wa了好多次。。 思路&#xff1a;一个面一个面判断就行了。。 #include …

POJ 1489

模拟题 注意要点&#xff1a; 1. 和快速幂类似&#xff0c;但是是加法。 2. 输入最后两行是\n&#xff1b; 3. 转string最后不要输出空格。 #include <cstdio> #include <cstring> #include <iostream> #include <map>using std::memset; using st…

ubuntu网络配置

配置ubuntu桥接网络 1> 查看网络是否链接 以是否能ping通为准&#xff0c;不要去看网络图标 ping baidu.com 2> 保证虚拟机有桥接网络 a. 虚拟机---->设置---->网络适配器------>选择桥接或者是Vmnet0 b. 编辑----->虚拟网络编辑器 如果没有vmnet0&…

【FOJ】Problem 1489 密码

Problem 1489 密码. 思路 存数组&#xff0c;读入得如果是字母返回对应密文表的字母小写的再转一下小写 笔记 千万记得给字符数组附初值&#xff01;&#xff01;&#xff01; 代码 #include<cstdio> #include<string.h> using namespace std;char m[30], st…

ZOJ 1489

题解: 当n为偶数或者1时显然无解(BSGS过程可证) 除此之外2与n互质&#xff0c; 则必存在2^phi(n) 1, 必有解 且最小解应该是phi(n)的最小约数x满足2^x % n 1; 质因子拆分 快速幂判断就可 CODE: #include <iostream> #include <cstdio> using namespace s…

洛谷 1489

这道题竟然是一个背包&#xff01;我之前设计了一个四维状态&#xff0c;f[i][j][k][0/1]表示在前i个人中选j个人&#xff0c;在i个人里划分的这两个集合差的绝对值&#xff0c;0表示少&#xff0c;1表示多&#xff0c;然后果断MLE&#xff0c;A了6个点。仔细再想想为什么这个状…

1489 ACM 贪心

题目&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1489 题意&#xff1a;为负数表示买酒&#xff0c;正数表示买酒&#xff0c;每两家人之间为one unit of work.问最小的work 思路:从左向右依次把久给离自己最近的买卖家就好。 代码算法原理如下&#xff1a; 以题目…

[TS-A1489][2013中国国家集训队第二次作业]抽奖[概率dp]

概率dp第一题&#xff0c;开始根本没搞懂&#xff0c;后来看了09年汤可因论文才基本搞懂&#xff0c;关键就是递推的时候做差比较一下&#xff0c;考虑新加入的情况对期望值的贡献&#xff0c;然后推推公式&#xff08;好像还是不太会推qaq...&#xff09; 1 #include <bits…

A1489. 抽奖(乔明达)

题解已经讲的很清楚了&#xff0c;就不鬼扯了&#xff0c;直接上代码 1 #include<bits/stdc.h>2 #define maxn 1000053 double a[maxn],p[maxn];4 double qp(double base,int x){5 double ans1;6 while(x){7 if(x&1)ansans*base;8 basebase*…

Oracle 查询优化改写(第五章)

第五章 使用字符串 1.遍历字符串 SELECT 天天向上 内容&#xff0c;level&#xff0c;substr(天天向上, LEVEL, 1) 汉字拆分FROM Dual CONNECT BY LEVEL < Length(天天向上);2.计算字符在字符串中出现的次数 3.从字符中删除不需要的字符 若员工姓名有元音字母AEIOU&#x…

粒子群算法(Particle Swarm Optimization(PSO)附简单案例及详细matlab源码)

作者&#xff1a;非妃是公主 专栏&#xff1a;《智能优化算法》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 专栏推荐序一、概论二、粒子群算法原理…

【Jmeter】在进行综合场景压测时,由于不同的请求,要求所占比例不同,那如何实现呢?

在进行综合场景压测时&#xff0c;由于不同的请求&#xff0c;要求所占比例不同&#xff0c;那如何实现呢&#xff1f; 有人说将这些请求分别放到单独的线程组下&#xff0c;然后将线程组的线程数按照比例进行配置&#xff0c;这种方法不是很好&#xff0c;想想&#xff0c;不…

Android实现一个可拖拽带有坐标尺的进度条

拿到上边的UI效果图&#xff0c;给我的第一印象就是这实现起来也太简单了吧&#xff0c;SeekBar轻轻松松就搞定了&#xff0c;换个thumb&#xff0c;加个渐变不就完成了&#xff0c;说搞就搞&#xff0c;搞着搞着就抑郁了&#xff0c;底部坐标尺还能搞&#xff0c;等比例分割后…

p9plus android 8,华为P9 Plus和mate8哪个好?华为P9 Plus和mate8详细对比评测

华为P9 Plus和mate8哪个好&#xff1f;华为P9 Plus和mate8有什么区别&#xff1f;很多用户对于华为P9Plus和mate8的区别对比还不是很清楚&#xff0c;下面小编就给大家带来华为P9 Plus和mate8的详细对比评测&#xff0c;还不了解的用户们一起来看看吧&#xff01; 1、华为P9 Pl…

抵挡不住的黑色诱惑,华为P10 Plus亮黑版真机图赏

今年的手机产品在配色方面可以说有了很大的突破&#xff0c;不过也一样一些恒久不衰的经典色系依然非常受到消费者的欢迎&#xff0c;比如说华为在前不久推出了亮黑版的华为P10 Plus&#xff0c;这款手机就具备非常高的颜值&#xff0c;而且亮黑色的机身看上去更加深邃、高冷&a…

面试专题:Redis

1.redis简介 简单来说 redis 就是一个数据库&#xff0c;不过与传统数据库不同的是 redis 的数据是存在内存中的&#xff0c;所以存写速度非常快&#xff0c; 因此 redis 被广泛应用于缓存方向。另外&#xff0c;redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不…

高颜值的5.9英寸大屏旗舰,华为Mate 9托帕蓝版真机图赏

以前很多智能手机都主打性价比&#xff0c;在设计上并不是过多重视&#xff0c;甚至有“没有设计就是最好的设计”的说法。不过随着配置和功能的同质化越来越严重&#xff0c;智能手机的颜值往往成了很多消费者最注重的一点&#xff0c;比拼颜值也是手机厂商发布会上的重点。 最…
最新文章