文章目錄
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))