POJ 1003 Hangover - 搜索算法 - 二分查找法

POJ 1003 Hangover

题意:寻找序列中不小于给定某数的最小数的序号。难度: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 

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 

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;
}







你可能感兴趣的:(C/C++,POJ)