序言
这几天开始刷PDD的一些算法题,有一起的找实习的小伙伴么哈哈哈 一起加油呀!!
多多鸡有N个魔术盒子(编号1~N),其中编号为i的盒子里有i个球。
多多鸡让皮皮虾每次选择一个数字X(1 <= X <= N),多多鸡就会把球数量大于等于X个的盒子里的球减少X个。
通过观察,皮皮虾已经掌握了其中的奥秘,并且发现只要通过一定的操作顺序,可以用最少的次数将所有盒子里的球变没。
那么请问聪明的你,是否已经知道了应该如何操作呢?
思路是 比如5的话,就是需要操作三次,减去3 减去 2 减去 1
那么对于N的话,减去中位数N/2是最合理的 变成
1,2,3,,,N/2 -1 , 0, 1,2,3,4,N/2
于是我们有1,2,3,4,5,,,,N/2需要造次操作
这次还是减去中位数 N/2/2 = N/4 ,变成
1,2,3,,,,,N/4-1, 0,1,2,3,4,,,N/4
于是我们有 1,2,3,4,,,,N/4
同理一直操作
则最后的次数x函数是
2
x
=
N
2^x = N
2x=N
所以
x
=
l
o
g
2
N
x = log_2{N}
x=log2N
代码如下:
n = int(input())
for i in range(n):
x =int(input())
print(len(bin(x))-2)
扔n个骰子,第i个骰子有可能投掷出Xi种等概率的不同的结果,数字从1到Xi。所有骰子的结果的最大值将作为最终结果。求最终结果的期望。
输入描述:
第一行一个整数n,表示有n个骰子。(1 <= n <= 50)
第二行n个整数,表示每个骰子的结果数Xi。(2 <= Xi <= 50)
输出描述:
输出最终结果的期望,保留两位小数
输入:
2
2 2
输出:
1.75
解释是:
2,2表示这两个骰子的最大数是2,即有1,和2的可能性
所以,
当出现最大数是1的时候,只有一种可能,即 1 , 1
当出现最大数是2的时候,有1,2 + 2,1 + 2,2 三种可能性
总共的可能性是4种
所以 期望是 1*(1/4)+ 2*(3/4) = 7/4 = 1.75
【这道题理解上需要时间,然后去找规律 】
再来一个例子:
输入:
3
4 3 2
输出:
总共的可能性是 432 = 24种
当出现最大数是1的时候,只有一种可能性1,1,1,即1✖️ 1✖️ 1 = 1 种可能性 概率为1/24
当出现最大数是2的时候,可能性数为:2✖️ 2✖️ 2 - 1✖️ 1✖️ 1 = 7种可能性 概率为7/24
当出现最大数是3的时候,可能性是 3✖️ 3✖️ 2 - 2✖️ 2✖️ 2 - 1✖️ 1✖️ 1 = 10种可能性 概率为10/24
当出现最大数是4的时候,可能性是 4✖️ 3✖️ 2 - 10 - 7 -1 = 6种可能性 概率为 6/24
所以这是有规律可寻的,只要把规律写进去,即可求解:
找规律
先找到最大值 max = 4
n= 3 num = [4,3,2]
所以我们要找 最大值为1,2,3,4分别的概率为多少:
对于最大数为1时:概率为1/4 ✖️ 1/3 ✖️ 1/2 = 1/24
对于最大数为2时:概率为 2/4 ✖️ 2/3 ✖️ 2/2 - 1/24 = 1/3 = 1/24 = 7/24
对于最大数为3时:概率为 3/4 ✖️ 3/3 ✖️ 2/2 - 7/24 - 1/24 = 10/24
对于最大数为4时:概率为 4/4 ✖️ 3/3 ✖️ 2/2 - 10/24 - 7/24 - 1/24 = 6/24
因此,我们找到了规律
分母都是 num[0]= 4,num[1]=3,num[2]=2,但分子是从最大数X和num[i] 比较,谁小谁做分子
下一步就是 再减去之前的所有概率
n = int(input())
num = list(map(int,input().strip().split()))
max_num = max(num)
pre = 0
ans = 0
for i in range(1,max_num+1):
#这里是模拟最大数的变化,即当最大数为1,2,3,,,时概率的计算
cur =1
for j in range(len(num)):
#这里是模拟num里的计算
cur = cur * min(i,num[j])/num[j]
#这里是模拟类似的1/4 ✖️ 1/3 ✖️ 1/2 这一步
ans += (cur - pre)*i
#这里是模拟减去之前的所有概率 乘于i是计算期望
pre = cur
print("%.2f" % ans)