买来了 n 个魔法弹珠,想做一个游戏。 魔法弹珠有一个特点,如果两枚魔法弹珠相互碰撞,较小的一枚会被较大的一枚吸收,较大的那枚的体积就会变成两枚弹珠的体积之和,如果两枚弹珠体积相同,则两枚弹珠被吸收的概率相同。 这个游戏就是,把弹珠全都放到一个桶里,然后摇摇摇......直到剩下最后一枚弹珠。 那么剩下的最后一个弹珠可能有几种情况呢? n 枚弹珠的编号各自是互不相同的,但体积可能一样。 两种游戏结果不同当且仅当最后剩余的弹珠编号不同。
第一行一个整数 n 第二行 n 个整数表示 n 个弹珠的体积 n≤ 10^5 弹珠体积 ≤ 10^9
输出一个整数表示答案。
4 6 6 2 3
2
考点:基础数学
数据规模 n ≤ 1e5 | 限制 2 秒 / 256MB | 标准输入输出
推荐方向:基础数学
本题切入点
体积最大的弹珠一定可以存活到最后(它吸收任何比它小的,且不会被更小的吸收);再据此推导还有哪些弹珠可能存活。
把题目转化为数学表达式,用公式或性质直接求值。
思路框架(基础数学 通法 · 非本题专属)
实现要点:浮点输出通常要求相对误差不超过 1e-7,注意用 double/long double 或高精度小数。
复杂度:时间 O(1) ~ O(log n) | 空间 O(1)
该范式的通法易错点
对照本题
样例 1:输入 4 / 6 6 2 3 → 输出 2
多次碰撞后,剩下的最后一颗弹珠体积是17,一定是最开始体积为6的弹珠变成的。但是有2颗不同编号为6的弹珠,所以我们输出2
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:【2023】贝壳找房春招Java工程师笔试卷1;【2023】贝壳找房春招C++工程师笔试卷1;【2023】贝壳找房春招前端工程师笔试卷1。