贝壳找房 · 哈希 · 算法编程题
贝壳找房 哈希 n ≤ 200 时限 1 秒 / 64 MB

题目描述

牛牛新开发了一款卡牌游戏,在这款游戏中,系统随机给出 n 张卡牌,每张卡牌都有战斗力和独特的技能,每张卡牌只能被选择一次,每位玩家必须手持其中的两张卡牌进入游戏。
为了保证游戏的公平性,牛牛规定,只有当每位玩家手中的两张卡牌战斗力之和相同时,才能认为这个对局是公平的。
但是牛牛发现,如果让玩家自行选择卡牌,总是会出现战斗力一边倒的局面,所以,他想请你写一个程序,由系统来完成随机分配卡牌的任务。
那么,在已知 n 张卡牌各自战斗力,且保证对局公平的情况下,此局游戏最多可以允许多少位玩家参与战斗?

输入输出

输入描述
本题为多组测试数据,第一行输入一个正整数 T( 1≤ T≤ 10) ,代表测试数据组数。
对于每组测试数据,第一行输入一个正整数 n( 1≤ n≤ 200) ,代表卡牌数量。
第二行输入 n 个正整数 a_ 1, a_ 2,..., a_ n( 1≤ a_ i≤ 100) ,依次代表每张卡牌的战斗力。
输出描述
对于每组测试数据,一行输出一个整数代表最多可以有多少位玩家参与战斗。特殊的,由于一场对局至少需要两名玩家,所以,若在保证对局公平的基础上,不能支持至少两名玩家参与对局,那么,只需要输出 - 1 代表该对局作废。

样例共 1 组

样例 1 · 第一个测试数据中,只有三张卡牌,由于一个玩家就需要手持两张卡牌,所以无论如何都不能支持至少两名玩家进行游戏。 第二个测试数据中,第一张卡牌和第四张卡牌的战斗力之和等于第二张卡牌和第三张卡牌的战斗力之和,可以让最多两名玩家同时进行游戏。
输入
2
3
3 6 9
4
2 3 5 6
输出
-1
2

算法解析依据充分

考点:哈希

数据规模 n ≤ 200 | 限制 1 秒 / 64MB | 标准输入输出

题目画像

  • 数据规模:n ≤ 200,T ≤ 10
  • 元素值域:i ≤ 100(注意整数类型选择,避免溢出)
  • 复杂度门槛:允许 O(n²);若 n ≤ 300,O(n³) 通常也跑得动,需看具体常数。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:哈希

本题切入点

要让每对玩家战斗力之和相同,枚举目标和 s,统计和为 s 的配对能凑出多少对,取最大玩家数。

用哈希表把「查找/计数」的开销降到 O(1) 均摊。

思路框架(哈希 通法 · 非本题专属)

  1. 一次遍历,把元素作为 key、出现次数/首次位置作为 value 存进哈希表。
  2. 第二次遍历(或边扫边查)拿到需要的信息。
  3. 注意哈希无序:需要按原顺序输出时要额外记录顺序。

实现要点:Python 用 dict / collections.Counter / defaultdict;C++ 用 unordered_map。

复杂度:时间 O(n) 均摊 | 空间 O(n)

该范式的通法易错点

  • 遍历哈希表时依赖了不存在的顺序。
  • 多次查询时每次都重新统计。

对照本题

  • 数据规模 n ≤ 200,允许 O(n²);若 n ≤ 300,O(n³) 通常也跑得动,需看具体常数。
  • 元素值域最大到 100 —— 求和 / 相乘时记得开 64 位整数。

样例解读

样例 1:输入 2 / 3 / 3 6 9 / 4 / 2 3 5 6 → 输出 -1 / 2

第一个测试数据中,只有三张卡牌,由于一个玩家就需要手持两张卡牌,所以无论如何都不能支持至少两名玩家进行游戏。

第二个测试数据中,第一张卡牌和第四张卡牌的战斗力之和等于第二张卡牌和第三张卡牌的战斗力之和,可以让最多两名玩家同时进行游戏。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:贝壳找房2023届校招前端类试卷。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解