Bootstrap

华为OD机试统一考试D卷C卷 - Wonderland( C语言)

题目描述

Wonderland是小王居住地一家很受欢迎的游乐园。

Wonderland目前有4种售票方式,分别为

  • 一日票(1天)、
  • 三日票(3天)、
  • 周票(7天)
  • 月票(30天)。

每种售票方式的价格由一个数组给出,每种票据在票面时限内可以无限制地进行游玩。例如:

小王在第10日买了一张三日票,小王可以在第10日、第11日和第12日进行无限制地游玩。

小王计划在接下来一年多次游玩该游乐园。小王计划地游玩日期将由一个数组给出。

现在,请您根据给出地售票价格数组和小王计划游玩日期数组,返回游玩计划所需要地最低消费。

输入描述

输入为2个数组:

  • 售票价格数组为costs,costs.length = 4,默认顺序为一日票、三日票、周票和月票。
  • 小王计划游玩日期数组为days,1 ≤ days.length ≤ 365,1 ≤ days[i] ≤ 365,默认顺序为升序。

输出描述

完成游玩计划的最低消费。

用例

输入 5 14 30 100
1 3 5 20 21 200 202 230
输出 40
说明 根据售票价格数组和游玩日期数组给出的信息,发现每次去玩的时候买一张一日票是最省钱的,所以小王会卖8张一日票,每张5元,最低花费是40元

解题思路

我们可以使用动态规划。核心思想是为每个游玩日期计算最低消费成本,并存储这些结果以供后续日期使用。具体步骤如下:

  1. 创建一个数组 dp 以存储直至每一天的最低消费。数组的长度为365天加1(因为数组是从0开始的,而天数是从1开始的)。
  2. 初始化 dp[0] = 0,因为在开始之前没有任何消费。
  3. 遍历每一天,对于每一天,我们有几种选择:
    • 如果这一天不在计划游玩日期中,则这一天的消费与前一天相同,即 dp[i] = dp[i-1]
    • 如果这一天在计划游玩日期中,我们需要考虑三种票价中的最低消费:
      • 一日票的消费是:dp[i-1] + costs[0]
      • 三日票的消费是:dp[max(i-3, 0)] + costs[1]<
;