这是我在备赛蓝桥杯是在官网上看到的题目,标签是动态规划。
我首先的想法是先算出所有的可能数,例如如果有10家同色调客栈,那么所有可能数就10*9/2=45种可能。
然后再减去减少的数量。为了算出减少的数量,需要算出在连续中断数,即在连续多少家同色调客栈之间没有可用餐的客栈。若连续5家客栈之间,则减少5*4/2=10家。
总数可以在输入时同时计算,现在要思考怎么优化计算减少种数的时间。我设置了near变量,记录最近的可用餐客栈的下标,设置dp二维数组。
for i in range(color_num):
dp.append([0,0,-1]) #记录总数量,记录连断数,上一个客栈的位置
如上代码,当上一个同色调客栈比near记录的下边近时,说明之间中断,中断数加一。
import os
import sys
f=input().split(" ")
hotle_num=int(f[0])
color_num=int(f[1])
cost_acpt=int(f[2])
detl=[]
dp=[]
ans=0
dec=0
near=-1
for i in range(color_num):
dp.append([0,0,-1]) #记录总数量,记录连断数,上一个客栈的位置
for i in range(hotle_num):
g=input().split(" ")
index=int(g[0])
price=int(g[1])
ans+=dp[index][0]
dp[index][0]+=1
if dp[index][2]>near : #说明中间没有价格符合的客栈
if price>cost_acpt :
dp[index][1]+=1
else :
near=i
if dp[index][1]!=0 :
dec+=(dp[index][1]+1)*(dp[index][1])/2
dp[index][1]=0
else :
if price<=cost_acpt :
near=i
if dp[index][1]!=0 :
dec+=(dp[index][1]+1)*(dp[index][1])/2
dp[index][1]=0
dp[index][2]=i
for item in dp:
dec+=(item[1]+1)*item[1]/2
print(int(ans-dec))
以上是全部python代码,若有不理解,可私信我。