zoukankan      html  css  js  c++  java
  • DP-动态规划-排队买票

    题目 :

    一场演唱会即将举行,现有n个歌迷排队买票,一人面一张票,而售票处规定,一人每次只能买一张票,假设第i位歌迷买一张票需要时间T[i](1<=i<=n),队伍中相邻的两位歌迷(第j个人和第j+1个人)也可以由其中一个人买两张票,而另一个人就可以不用排队了,则这两位歌迷买两张票的时间变为R[j],且有R[j]<T[j]+T[j+1],这样做就可以缩短后面歌迷的等待时间,加快整个售票的进程。现在给出 n ,T[j]和R[j],求使每个人都买到票的最短时间和算法。

    题目解析:

    首先题目有歧义:

    队伍中相邻的两位歌迷(第j个人和第j+1个人)也可以由其中一个人买两张票,而另一个人就可以不用排队了

    这样理解的话: 第i个人可以给 第 i+1 买 也可以给 i-1 买

    则这两位歌迷买两张票的时间变为R[j],且有R[j]<T[j]+T[j+1]

    这样理解的话:第 i 个人只能给 第i+1 个人买

    两种的理解的有两种的解题的方式,先说简单的   第二种理解方式:

    从最后一个人考虑 要么自己买,要么让前一个人代买:
    
    设 f(i)表示 前i个 买票的最短时间,则
    
    f(i) = min{f(i-1)+T[i],f(i-2)+R[i-1]}  (i = 2 ~ n)

    较难理解的是第二种:第 i 个人可以给第 i-1 个人买,也可以给第 i+1 个买

    从最后一个考虑:有5种情况,1,单独买,2:给前一个人买,3:给后一个人买,4:让前一个人买,5:让后一个人买

    则:状态转移方程分5种情况:
    F(I,仅买1张)=MIN{F(I-1,仅买1张),F(I-1,买2张代前一位),F(I-1,不买由前代)}+Ti
    F(I,买2张代前一位)=MIN{F(I-2,仅买1张),F(I-2,买2张代前一位),F(I-2,不买由前代)}+Ri
    F(I,买2张代后一位)=MIN{F(I-1,仅买1张),F(I-1,买2张代前一位),F(I-1,不买由前代)}+Ri
    F(I,不买由前代)= F(I-1,买2张代后一位)
    F(I,不买由后代)=MIN{ F(I-1,仅买1张),F(I-1,买2张代前一位),F(I-1,不买由前代)}
  • 相关阅读:
    代理与反向代理
    Spring Batch 远程分区和远程分块的区别
    XWIKI部署安装
    想写一些与技术无关的
    1104报表
    ARQC与ARPC的生成和校验方法
    学习开源框架的一些总结
    linux java -version 和 javac -version 不一致
    spring boot 概念
    Unable to open socket file: target process not responding or HotSpot VM not loaded
  • 原文地址:https://www.cnblogs.com/rainboy/p/3707044.html
Copyright © 2011-2022 走看看