python 选择客栈 思考与改进

文章描述了如何使用动态规划方法解决一个关于客栈的问题,通过计算所有可能的数量并减去因连续客栈价格不符合条件而减少的数量,利用二维数组dp进行优化,最终输出符合条件的客栈总数。
摘要由CSDN通过智能技术生成

这是我在备赛蓝桥杯是在官网上看到的题目,标签是动态规划。

我首先的想法是先算出所有的可能数,例如如果有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代码,若有不理解,可私信我。

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值