贝壳找房 · 基础数学 · 算法编程题
贝壳找房 基础数学 n ≤ 1e5 时限 2 秒 / 256 MB

题目描述

买来了 n 个魔法弹珠,想做一个游戏。
魔法弹珠有一个特点,如果两枚魔法弹珠相互碰撞,较小的一枚会被较大的一枚吸收,较大的那枚的体积就会变成两枚弹珠的体积之和,如果两枚弹珠体积相同,则两枚弹珠被吸收的概率相同。
这个游戏就是,把弹珠全都放到一个桶里,然后摇摇摇......直到剩下最后一枚弹珠。
那么剩下的最后一个弹珠可能有几种情况呢?
n 枚弹珠的编号各自是互不相同的,但体积可能一样。
两种游戏结果不同当且仅当最后剩余的弹珠编号不同。

输入输出

输入描述
第一行一个整数 n
第二行 n 个整数表示 n 个弹珠的体积
n≤ 10^5 弹珠体积 ≤ 10^9
输出描述
输出一个整数表示答案。

样例共 1 组

样例 1 · 多次碰撞后,剩下的最后一颗弹珠体积是17,一定是最开始体积为6的弹珠变成的。但是有2颗不同编号为6的弹珠,所以我们输出2
输入
4
6 6 2 3
输出
2

算法解析依据充分

考点:基础数学

数据规模 n ≤ 1e5 | 限制 2 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:n ≤ 1e5
  • 复杂度门槛:只允许 O(n log n) 及更优,朴素 O(n²) 会超时。
  • 源站时限:2 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:基础数学

本题切入点

体积最大的弹珠一定可以存活到最后(它吸收任何比它小的,且不会被更小的吸收);再据此推导还有哪些弹珠可能存活。

把题目转化为数学表达式,用公式或性质直接求值。

思路框架(基础数学 通法 · 非本题专属)

  1. 先写出题目要求的数学表达式或所求量的定义。
  2. 利用代数变形、不等式、函数单调性等性质化简。
  3. 按题面给的精度要求输出(浮点题注意误差)。
  4. 数据范围大时,往往存在 O(1) 或 O(log n) 的数学解,不必模拟。

实现要点:浮点输出通常要求相对误差不超过 1e-7,注意用 double/long double 或高精度小数。

复杂度:时间 O(1) ~ O(log n) | 空间 O(1)

该范式的通法易错点

  • 整数除法丢精度;浮点比较直接用 == 。
  • 题目要求「相对误差」而非「绝对误差」,输出格式没对齐。

对照本题

  • 数据规模 n ≤ 1e5,只允许 O(n log n) 及更优,朴素 O(n²) 会超时。

样例解读

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

多次碰撞后,剩下的最后一颗弹珠体积是17,一定是最开始体积为6的弹珠变成的。但是有2颗不同编号为6的弹珠,所以我们输出2

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

本题来源:【2023】贝壳找房春招Java工程师笔试卷1;【2023】贝壳找房春招C++工程师笔试卷1;【2023】贝壳找房春招前端工程师笔试卷1。

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