C++ 代码:二分法找出次品球
这道题是著名的二分法的经典应用,需要称的次数为 log2(n)。
具体思路如下:
-
将 n 个球均分为两组,分别放在天平的两端进行称重,记录下天平的结果。
-
如果天平平衡,则说明次品不在这两组中,将剩下的球分为两组,重复步骤 1。
-
如果天平不平衡,说明次品在较轻的一组或较重的一组中。
-
将较轻的一组再次分为两组,重复步骤 1。
-
将较重的一组再次分为两组,重复步骤 1。
-
重复以上步骤,直到找到次品为止。
代码实现如下:
#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;
}
原文地址: https://www.cveoy.top/t/topic/lXrE 著作权归作者所有。请勿转载和采集!