千帆杯第一期赛题:游乐场排队规划助手(香港迪士尼python解法)

目录

题目背景

题目内容

香港迪士尼

获取最大刺激指数算和

获取最大视觉指数和

提问示例


 

题目背景

随着春节假期来临,环球影城等热门主题游乐场成为大人孩子的经典过节选项,但巨大的人流也意味着排队成为游客最大的痛点,游乐场项目多、如何在有限的游玩时间内收获最大的快乐,是本期赛题要解决的问题

题目内容

官方提供「环球影城」、「上海迪士尼」、「香港迪士尼」、「广州长隆」四个热门游乐场地图(地图信息见下图list),地图中标注各项目的排队+游玩时间、视觉体验指数、刺激指数,每个项目最多玩一次,不考虑项目之间的交通时间

香港迪士尼

下图为娱乐内容:

数据表:

娱乐名称排队+游玩时间(分钟)视觉体验指数(分)刺激指数(分)
小小世界5072
星战极速穿梭40810
钢铁奇侠飞行之旅40107
雪岭滑雪橇6076
小熊维尼历险之旅5064
蚁侠与黄蜂女3567
魔雪奇幻之旅60108
冲天遥控车60510
迷离大宅5567
灰熊山极速矿车85710

这里的数据表使用的是xlsx来存储的,名称可以在代码中看到【disneyland_projects.xlsx】,注意如果使用的是AI提问记得上传数据文件。

获取最大刺激指数算和

规定时间内获取最大刺激指数的python解法

import pandas as pd
# 文件确认和数据读取
try:
    data = pd.read_excel('disneyland_projects.xlsx')
    print("文件读取成功!")
except Exception as e:
    print(f"文件读取失败:{e}")
    exit()
# 时间转换
play_time = 5 * 60  # 5小时转换为分钟
# 动态规划算法应用
def knapsack(values, weights, capacity):
    n = len(values)
    dp = [[0 for _ in range(capacity + 1)] for _ in range(n + 1)]
    for i in range(1, n + 1):
        for w in range(1, capacity + 1):
            if weights[i - 1] <= w:
                dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1])
            else:
                dp[i][w] = dp[i - 1][w]
    selected_items = []
    w = capacity
    for i in range(n, 0, -1):
        if dp[i][w] > dp[i - 1][w] and weights[i - 1] <= w:
            selected_items.append(i - 1)
            w -= weights[i - 1]
    return dp[n][capacity], [data.iloc[index]['娱乐名称'] for index in selected_items[::-1]]
# 提取刺激指数和游玩时间
stimulation_indices = data['刺激指数(分)'].tolist()
play_durations = data['排队+游玩时间(分钟)'].tolist()
# 计算最大刺激指数和对应的项目组合
max_stimulation, projects_combination = knapsack(stimulation_indices, play_durations, play_time)
# 结果输出
print(f"在限定时间内,最大的刺激指数总和为:{max_stimulation}")
print(f"对应的娱乐项目组合为:{', '.join(projects_combination)}")

 最终结果:

我们为您计算在5个小时内能达到最大刺激指数的项目组合。在限定时间内,最大的刺激指数总和为 49 。对应的娱乐项目组合为:星战极速穿梭, 钢铁奇侠飞行之旅, 蚁侠与黄蜂女, 魔雪奇幻之旅, 冲天遥控车, 迷离大宅。这个组合将为您带来最刺激的游玩体验。

获取最大视觉指数和

规定时间内获取最大视觉指数的python解法

import pandas as pd
# 读取数据
df = pd.read_excel('disneyland_projects.xlsx')
# 提取必要的信息
projects = df['娱乐名称'].tolist()
times = df['排队+游玩时间(分钟)'].tolist()
visual_scores = df['视觉体验指数(分)'].tolist()
# 初始化动态规划表格
n = len(projects)
T = 120  # 总时间
dp = [[0] * (T + 1) for _ in range(n + 1)]
# 填充动态规划表格
for i in range(1, n + 1):
    for t in range(1, T + 1):
        if times[i - 1] <= t:
            dp[i][t] = max(dp[i - 1][t], dp[i - 1][t - times[i - 1]] + visual_scores[i - 1])
        else:
            dp[i][t] = dp[i - 1][t]
# 回溯找到选择的项目
selected_projects = []
t = T
for i in range(n, 0, -1):
    if times[i - 1] <= t and dp[i][t] > dp[i - 1][t]:
        selected_projects.append(projects[i - 1])
        t -= times[i - 1]
# 输出结果
print(f"在{T}分钟内,您可以获得的最大视觉体验指数是:{dp[n][T]}分。")
print(f"对应的娱乐项目组合是:{selected_projects[::-1]}。")

最终结果:

在限定的120分钟内,为了获得最大的视觉体验指数,推荐您选择以下娱乐项目组合:星战极速穿梭、钢铁奇侠飞行之旅和蚁侠与黄蜂女。这样的组合可以让您在120分钟内获得高达24分的视觉体验指数,为您的迪士尼之旅增添更多的视觉享受。

提问示例

1、游玩5个小时,玩哪些项目的组合刺激指数最大。

2、只有120分钟的时间,怎么玩视觉指数最大。

3、我现在只有4小时20分钟的时间,请问玩哪些项目最刺激?

这里别指望使用暴力,暴力是肯定超时的。

问题3结果:

在有限的4小时20分钟(即260分钟)内,若追求最大的刺激体验,推荐您选择以下娱乐项目:灰熊山极速矿车、迷离大宅、冲天遥控车和魔雪奇幻之旅。这些项目的组合将带给您高达44分的总刺激指数,让您在短暂的时间内充分感受到迪士尼乐园的惊险与刺激。