您的位置:首页 > 编程语言 > Go语言

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

2014-02-24 22:11 393 查看
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 <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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  POJ 二分查找