这道题是著名的二分法的经典应用,需要称的次数为 log2(n)。

具体思路如下:

  1. 将 n 个球均分为两组,分别放在天平的两端进行称重,记录下天平的结果。

  2. 如果天平平衡,则说明次品不在这两组中,将剩下的球分为两组,重复步骤 1。

  3. 如果天平不平衡,说明次品在较轻的一组或较重的一组中。

  4. 将较轻的一组再次分为两组,重复步骤 1。

  5. 将较重的一组再次分为两组,重复步骤 1。

  6. 重复以上步骤,直到找到次品为止。

代码实现如下:

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n; // 输入球的总数
    int left = 0, right = n-1, mid; // 初始化左右边界
    int ans = -1; // 记录次品的位置
    while (left <= right)
    {
        mid = (left + right) / 2; // 取中间位置
        cout << mid + 1 << ' '; // 输出天平称重的位置,方便查看
        char c;
        cin >> c; // 输入天平结果
        if (c == '=') // 平衡,次品不在这一组
        {
            left = mid + 1; // 将左边界设为中间位置的右侧
        }
        else // 不平衡,次品在较轻或较重的一组中
        {
            ans = mid; // 记录下次品的位置
            right = mid - 1; // 将右边界设为中间位置的左侧
        }
    }
    cout << ans + 1 << endl; // 输出次品的位置
    return 0;
}
C++ 代码:二分法找出次品球

原文地址: https://www.cveoy.top/t/topic/lXrE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录