POJ1003 Hangover

题目来源:http://poj.org/problem?id=1003

题目大意:

  将一叠卡片堆放在桌边。如果有一张卡片,你可以最多让卡片的一半悬于桌边外。(假设卡片总是与桌边垂直的。)当有两张卡时,你可以让上面的一张卡片有一半悬于底下的卡片之外,下面的卡片则有1/3悬于桌外。故悬于桌外的卡片长度和为1/2 + 1/3 = 5/6.当有你张卡片时,总的悬于桌外的长度和最大为1/2 + 1/3 + 1/4 + ... + 1/(n - 1).其中,最顶端的卡片外悬1/2,第二张外悬1/3,第三张外悬1/4...最底部的一张外悬1/(n+1).如下图所示:

输入:有多组测试样例组成,每行包含一个正的浮点数c,最小为0.01,最大为5.20,每个c恰好为3位。以0.00作为结束标志。

输出:对于每一个测试样例,输出最少需要多少张卡片才能使总的外悬长度至少为c。使用Example Output中的格式输出。


 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)

 


本题题干中已经把公式给出,因为数据规模小,只需从小到大逐个检验n是否可行即可。

 1 //////////////////////////////////////////////////////////////////////////
 2 //        POJ1003 Hangover
 3 //        Memory: 252K        Time: 0MS
 4 //        Language: C++        Result: Accepted
 5 //////////////////////////////////////////////////////////////////////////
 6 
 7 #include <iostream>
 8 
 9 using namespace std;
10 
11 int main(void) {
12     while (true) {
13         float length = 0.0;
14         cin >> length;
15         if (length == 0) {
16             break;
17         }
18         float f = 0.5;
19         int i = 1;
20         while (true) {
21             if (f >= length) {
22                 break;
23             }
24             else {
25                 i++;
26                 f += (1.0 / (i + 1));
27             }
28         }
29         cout << i << " card(s)" << endl;
30     }
31     return 0;
32 }
View Code
posted @ 2013-07-30 17:21  小菜刷题史  阅读(280)  评论(0编辑  收藏  举报