一. 题目
Hangover
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 116593 | Accepted: 56886 |
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.
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)
Source
二. 题意
- 按照固定的累加方式:从高层到低层,相对于其相邻下层可以伸出的长度为(1/2),(1/3),...,(1/n)
- 给定一个指定长度 S,问最少需要累加多上块板,使其相对于桌面的伸出长度大于或等于 S
三. 分析
- 算法核心: 此题比较简单,无需考虑任何算法
- 实现细节: 简单的浮点数累加运算即可
四. 题解
1 #include <stdio.h> 2 3 int main() 4 { 5 int i; 6 float length, sum; 7 8 while (1) { 9 sum = 0; 10 scanf("%f\n", &length); 11 if (!length) break; 12 13 for (i = 2; ; i++) { 14 sum += (1 / (float)i); 15 16 if (sum >= length) { 17 printf("%d card(s)\n", i - 1); 18 break; 19 } 20 } 21 } 22 23 return 0; 24 }