Hangover

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 85166 Accepted: 40992

Description

How far can you make a stack of cards overhang a table? If you have one card, you can create a maximum overhang of half a card length. (We’re assuming that the cards must be perpendicular to the table.) With two cards you can make the top card overhang the bottom one by half a card length, and the bottom one overhang the table by a third of a card length, for a total maximum overhang of 1/2 + 1/3 = 5/6 card lengths. In general you can make n cards overhang by 1/2 + 1/3 + 1/4 + … + 1/(n + 1) card lengths, where the top card overhangs the second by 1/2, the second overhangs tha third by 1/3, the third overhangs the fourth by 1/4, etc., and the bottom card overhangs the table by 1/(n + 1). This is illustrated in the figure below.

hangover

Input

The input consists of one or more test cases, followed by a line containing the number 0.00 that signals the end of the input. Each test case is a single line containing a positive floating-point number c whose value is at least 0.01 and at most 5.20; c will contain exactly three digits.

Output

For each test case, output the minimum number of cards necessary to achieve an overhang of at least c card lengths. Use the exact output format shown in the examples.

Sample Input

1.00
3.71
0.04
5.19
0.00

Sample Output

3 card(s)
61 card(s)
1 card(s)
273 card(s)
解:
这道题同样是给出了一个范围,最小值0.01,最大值5.2,所以我们可以先把几张卡片对应多少的长度给算出来,大家可以看到一张卡片式1/2,两张是1/2+1/3,根据这个规律,n张卡片就是n-1张卡片的长度加上1/(n+1)。计算出这个对应表之后,就可以用来输入测试数据的时候进行查找了,这里可以使用二分法来查找,二分法的算法就在下面的代码中,因为本题是至少需要伸出多少张卡片才能达到输入数据的长度,所以我们就要选择右指针作为卡片的张数。
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
	int total;
	float len[276], tmp;
	len[0] = 0;
	for (total = 1; len[total-1] <= 5.2; total++) {
		tmp = len[total-1] + 1 / (float)(total + 1);
		if (tmp <= 5.2) {
			len[total] = tmp;
		} else {
			break;
		}
	}

	float input;
	while (cin>>input) {
		if (input == 0.00) {
			return 0;
		}
		int left, right, middle;
		left = 0;
		right = total;
		while (left + 1 < right) {
			middle = (right + left) / 2;
			if (len[middle] < input) {
				left = middle;
			} else {
				right = middle;
			}
		}
		cout<<right<<" card(s)"<<endl;
	}
	return 0;
}
Result Memory Time Language Code Length
Accepted 256K 0MS C++ 653B

 

Tonitech版权所有 | 转载请注明出处: http://www.tonitech.com/1682.html

发表评论