今天遇到一道题,第一眼就想到了用二分法来解决,可是二分法却没有通过,后来才知道三分法才是解决找假币最快的方法,题目描述如下:
思路:当硬币的个数只有一个时,需要0次。当硬币个数为2时,需要1次。当硬币个数大于等于3时,我们按下面方法将硬币分为3堆:
- n%3=0,分为n/3、n/3、n/3三堆。由于要求最坏情况,我们先用天平对n/3和n/3检测,失败后再对n/3个硬币做三分法。
- n%3=1,分为(n/3)+1、n/3、n/3三堆。我们先用天平对n/3和n/3检测,失败后再对(n/3)_1个硬币做三分法。
- n%3=2,分为(n/3)+1、(n/3)+1、n/3三堆。我们先用天平对(n/3)+1和(n/3)+1检测,由于要求最坏情况,再对(n/3)+1个硬币做三分法。
当n变为1的时候结束。
具体代码如下:
#include <iostream>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
int count = 0;
if (n == 0)
break;
while (n > 1)
{
++count;
//余数为1或2对(n/3)+1继续进行三分
n = n/3 + (n%3 > 0);
}
cout << count << endl;
}
return 0;
}