文章目录
2019.9.8 爱奇艺劝退题
1. 排列计数
考完试才知道是原题,leetcode903
n = int(input())
data = [int(x) for x in input().split()]
dp = [1 for _ in range(len(data)+1)]
for i in data:
if i==1:
dp.pop(0)
for j in range(len(dp)-2,-1,-1):
dp[j]+=dp[j+1]
#print(dp)
else:
dp.pop()
for j in range(1,len(dp)):
dp[j]+=dp[j-1]
#print(dp)
mo = 1000000007
print(dp[0]%mo)
2. 红蓝球
解法:动态规划,dp[i][j]表示i个红球和j个蓝球A的获胜概率.如果i=0,dp[i][j]=0.如果j=0,dp[i][j]=1.否则的话dp[i][j]由下列步骤求得:
dp[i][j]+=i/(i+j);//表示A直接取得红球的概率
如果j=1,那么dp[i][j]+=0.A取蓝球之后,B肯定获胜
如果j=2,dp[i][j]+=j/(i+j)(j-1)/(i+j-1)dp[i-1][j-2];j/(i+j)是A取蓝球的概率,在A取蓝球的基础上B再取蓝球A才有获胜机会,所以(j-1)/(i+j-1)表示B再取蓝球的概率,然后C只能从红球选一个,在ABC选一轮后,A的获胜概率就要加上dp[i-1][j-2],所以A获胜的概率为j/(i+j)(j-1)/(i+j-1)dp[i-1][j-2];
如果j>2,dp[i][j]+=j/(i+j)(j-1)/(i+j-1)(i/(i+j-2)*dp[i-1][j-2]+(j-2)/(i+j-2)*dp[i][j-3]);i/(i+j-2)*dp[i-1][j-2]+(j-2)/(i+j-2)*dp[i][j-3]表示A从蓝球选一个,B从蓝球选一个后,C分别从红球蓝球取出一个的A的获胜概率.
tmp = input().split()
m,n=int(tmp[0]),int(tmp[1])
timesA = (m+n+1)//3
al = (m+n)
re = 0
pA = 1
cur = 1
for _ in range(timesA):
pA = m/(m+n)
re+=cur*pA
#print(re)
n-=1
if(n<=0):
break
cur*=(1-pA)*(n/(m+n))
n-=1
if((al)%3==1 and n<=0):
re+=cur
break
re*=1000000
if re%10==5:
re+=5
re/=1000000
print('{:.5f}'.format(re))
2019.9.8 搜狗三道劝退题
1.
2019.9.11 英语流利说
1. 检测有向图是否有环
这题没写出来。
2019.9.12 58同城
1. 特别简单一道题
2. 小朋友发糖果,相邻小朋友高分比低分的糖果多,最少需要多少糖果
def func(nums):
if len(nums) == 1:
return 1
res = [0 for _ in range(len(nums))]
res[0] = 1
for i in range(1, len(nums)):
if nums[i] > nums[i - 1]:
res[i] = res[i - 1] + 1
else:
res[i] = 1
for i in range(len(nums) - 2, -1, -1):
if nums[i] > nums[i + 1] and res[i] <= res[i + 1]:
res[i] = max(res[i], res[i + 1] + 1)
return sum(res)
n = int(input())
nums = []
for i in range(n):
nums.append(int(input()))
print(func(nums))