当前位置: 首页 > news >正文

Split stay

给定 n 个 hotel,每个 hotel 对应一个列表,里面的数字代表房源空闲的日期,还有一个可以请求的日期范围 [start_date, end_date]。

然后把这个区间能够 split 成连续的两段,分别能够找到两个 hotel 来满足这个对应区间,且左右不能来回 overlapping(只能 forward)。要求返回对应的 hotel 组合,且不能重复。

简单版本

 1 def find_hotel_pairs(hotels, start_date, end_date):
 2     """
 3     hotels: Dict[str, List[int]] -> { "Hotel1": [1, 2, 3], "Hotel2": [4, 5], ... }
 4     start_date: int
 5     end_date: int
 6     """
 7     # 1. 预处理:将日期列表转换为集合,提高查询效率
 8     hotel_sets = {name: set(dates) for name, dates in hotels.items()}
 9     hotel_names = list(hotels.keys())
10     results = set()
11 
12     # 定义一个辅助函数,检查酒店是否覆盖特定闭区间
13     def covers_range(hotel_name, s, e):
14         s_set = hotel_sets[hotel_name]
15         for d in range(s, e + 1):
16             if d not in s_set:
17                 return False
18         return True
19 
20     # 2. 枚举分割点 k
21     # 目标区间被分为 [start_date, k] 和 [k + 1, end_date]
22     for k in range(start_date, end_date):
23         left_part_hotels = []
24         right_part_hotels = []
25 
26         # 找出哪些酒店满足左半段,哪些满足右半段
27         for name in hotel_names:
28             if covers_range(name, start_date, k):
29                 left_part_hotels.append(name)
30             if covers_range(name, k + 1, end_date):
31                 right_part_hotels.append(name)
32 
33         # 3. 组合满足条件的酒店对
34         for h_a in left_part_hotels:
35             for h_b in right_part_hotels:
36                 # 如果要求两家酒店不能是同一家,可以加上 if h_a != h_b
37                 results.add((h_a, h_b))
38 
39     return list(results)
40 
41 # --- 测试用例 ---
42 hotels_data = {
43     "Hotel_A": [10, 11, 12],
44     "Hotel_B": [12, 13, 14, 15],
45     "Hotel_C": [10, 11],
46     "Hotel_D": [13, 14, 15]
47 }
48 
49 start, end = 10, 15
50 pairs = find_hotel_pairs(hotels_data, start, end)
51 
52 print(f"在区间 [{start}, {end}] 内满足条件的酒店组合有:")
53 for p in pairs:
54     print(f"前半段: {p[0]}, 后半段: {p[1]}")

 

进阶版本

 1 def find_hotel_pairs_optimized(hotels, start_date, end_date):
 2     hotel_sets = {name: set(dates) for name, dates in hotels.items()}
 3     
 4     # 记录哪些酒店能覆盖 [start_date, k]
 5     # left_reach[k] 存储所有能覆盖 start_date 到 k 的酒店名
 6     left_reach = {}
 7     # 记录哪些酒店能覆盖 [k, end_date]
 8     # right_reach[k] 存储所有能覆盖 k 到 end_date 的酒店名
 9     right_reach = {}
10 
11     total_range = range(start_date, end_date + 1)
12 
13     for name, dates_set in hotel_sets.items():
14         # 1. 从左向右检查连续性
15         for k in range(start_date, end_date):
16             # 只有当 [start_date, k] 都在集合里,该酒店才符合前半段
17             if all(d in dates_set for d in range(start_date, k + 1)):
18                 left_reach.setdefault(k, []).append(name)
19             else:
20                 break # 一旦断开,更长的区间也不可能满足
21         
22         # 2. 从右向左检查连续性
23         for k in range(end_date, start_date, -1):
24             # 只有当 [k, end_date] 都在集合里,该酒店才符合后半段
25             if all(d in dates_set for d in range(k, end_date + 1)):
26                 right_reach.setdefault(k, []).append(name)
27             else:
28                 break
29 
30     # 3. 组合结果
31     results = set()
32     # 分割点 k 是前半段的终点,k+1 是后半段的起点
33     for k in range(start_date, end_date):
34         lefts = left_reach.get(k, [])
35         rights = right_reach.get(k + 1, [])
36         
37         for h1 in lefts:
38             for h2 in rights:
39                 results.add((h1, h2))
40 
41     return list(results)

 

http://www.jsqmd.com/news/404339/

相关文章:

  • 2026年质量好的固定矿车/1吨矿车怎么选直销厂家价格参考 - 品牌宣传支持者
  • 2026年知名的有轨平板车/履带平板车生产商采购建议怎么选 - 品牌宣传支持者
  • 2026年热门的异型铰链/阻尼异型铰链哪家好销售厂家推荐 - 品牌宣传支持者
  • 商用跑步机选型不踩坑|BH商用跑步机优选指南,上海杰禾力赋能全场景落地 - 冠顶工业设备
  • 2026年评价高的施肥旋耕机一体机/旋耕机中箱款公司实力参考哪家强(可靠) - 品牌宣传支持者
  • 2026年知名的腐蚀冲蚀摩擦磨损试验机/立式万能摩擦磨损试验机更新厂家选择指南哪家好 - 品牌宣传支持者
  • 2026年质量好的智能干选选煤设备/新型多级风力选煤设备实力工厂参考哪家靠谱(高评价) - 品牌宣传支持者
  • 2026年评价高的全自动称重包装机/橡胶称重包装机供应商采购指南选哪家 - 品牌宣传支持者
  • 人工智能毕设新颖的课题推荐
  • 精准赋能,专属陪伴|武汉普拉提一对一课程,解锁你的私人健身新体验 - 冠顶工业设备
  • 超越绘图:构建组件化、可交互的 Python 数据可视化管道
  • 2026年质量好的聚脲美缝剂/手工聚脲屋面防水实力工厂参考怎么选 - 品牌宣传支持者
  • 2026年质量好的节水灌溉管件/灌溉管件工厂直供推荐哪家专业 - 品牌宣传支持者
  • c#里氏替换
  • 2026年比较好的山东电动伺服疲劳试验机/旋转弯曲疲劳试验机怎么选实力工厂参考 - 品牌宣传支持者
  • 2026年评价高的制药高低温一体机/全密闭防爆高低温一体机厂家推荐哪家好(高评价) - 品牌宣传支持者
  • c#继承的原则
  • 2026年大模型AI搜索优化服务商全景透视:五大标杆与战略选型决策参考 - 2026年企业推荐榜
  • 从原理到实践:一份面向开发者的硬盘分区终极指南
  • 2026年热门的水处理环保设备/环保设备哪家靠谱实力工厂参考 - 品牌宣传支持者
  • 2026年比较好的高压隔膜压滤机/化粪池污泥压滤机生产商采购建议怎么选 - 品牌宣传支持者
  • 2026年评价高的山东生活污水处理设备/泥沙泥浆污水处理设备哪家靠谱可靠供应商参考 - 品牌宣传支持者
  • 2026年评价高的排矸降灰选煤设备/风力选煤设备品牌厂家推荐哪家强 - 品牌宣传支持者
  • 2026年质量好的陶瓷化硅橡胶/自润滑硅橡胶哪家强品牌厂家推荐 - 品牌宣传支持者
  • 2026年靠谱的GEO系统/GEO优化推荐与选购指南公司 - 品牌宣传支持者
  • 2026年口碑好的50升双层玻璃反应釜/防爆双层玻璃反应釜工厂直供推荐哪家专业 - 品牌宣传支持者
  • 2026年评价高的上海旋转蒸发器/专业旋转蒸发器公司实力参考哪家强(可靠) - 品牌宣传支持者
  • 2026年评价高的真空发生器供应商推荐怎么联系(畅销) - 品牌宣传支持者
  • 2026年知名的隐藏同步托底轨/缓冲同步托底轨供应商采购指南怎么联系 - 品牌宣传支持者
  • 预见未来,驾驭增长:2026年2月生成式引擎优化(GEO)服务商选型指南 - 2026年企业推荐榜