刷PDD笔试题--编程

序言

这几天开始刷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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jianafeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值