题意:寻找序列中不小于给定某数的最小数的序号。难度:1星。
理清题意,我的直接反应就是用搜索算法。于是就准备写二分查找法的代码。写的过程中发现自己对二分查找法掌握的不扎实:首先是算法的基本框架不熟悉,再就是把握不好算法的出口。写完提交AC后,在讨论区中发现直接算看起来还简单一些,那也写一下吧。
温习一下二分查找法:
int BiSearch(float sum[], int low, int high, float c)
{/* 二分查找法,返回sum[]大于等于c的最小序号 */
while (1 < high - low)
{
int mid = (low + high) >> 1;
if (c < sum[mid])
{
high = mid;
}
else
{
low = mid;
}
}
return sum[low] == c ? low : high;
}
题解代码1:(二分查找法)
/*
* POJ 1003 Hangover
* 寻找序列中不小于c的最小数的序号;
*
* 直观反馈是用查找法;
* 发现二分查找法不扎实!!
*
*/
#include <iostream>
using namespace std;
int BiSearch(float [], int, int, float);
int main()
{
float sum[277] = {0};
float c;
int i, n;
for (i = 1; i < 277; i++)
{
sum[i] = sum[i - 1] + 1.0 / (i + 1);
}
while (1)
{
cin >> c;
if (0 == c)
{
break;
}
n = BiSearch(sum, 0, 277, c);
cout << n << " card(s)" << endl;
}
return 0;
}
int BiSearch(float sum[], int low, int high, float c)
{/* 二分查找法,返回sum[]大于等于c的最小序号 */
while (1 < high - low)
{
int mid = (low + high) >> 1;
if (c < sum[mid])
{
high = mid;
}
else
{
low = mid;
}
}
return sum[low] == c ? low : high;
}
题解代码2:
/*
* POJ 1003 Hangover
* 寻找序列中不小于c的最小数的序号;
*
* 直接计算……;
*
*
*/
#include <iostream>
using namespace std;
int main()
{
float c;
float sum;
int i;
while (1)
{
cin >> c;
if (!c)
{
break;
}
for (i = 1, sum = 0; sum < c; i++)
{
sum += 1.0 / (i + 1);
}
cout << --i << " card(s)" << endl;
}
return 0;
}