Hangover
Description
你能在多大程度上让一堆卡片悬在一张桌子上?如果您有一张卡,则可以创建一半卡长度的最大悬伸。(我们假设卡片必须垂直于桌子。)使用两张卡片,您可以将顶部卡片从底部悬垂一半,卡片长度增加一半,而底部卡片占据卡片长度的三分之一,总长度为1/2 + 1/3 = 5/6卡长度。一般来说,你可以让ň卡悬1/2 +1/3 + 1/4 + … + 1 /(ñ +1)卡片长度,其中顶部卡片伸出第二个1/2,第二个伸出第三个1/3,第三个伸出第四个1/4等,底部卡片悬挂在桌子上1 / (n + 1)。这在下图中说明。
Input
输入包含一个或多个测试用例,后跟一个包含数字0.00的行,表示输入结束。每个测试用例是包含正浮点数c的单行,其值至少为0.01且至多为5.20; c将包含正好三位数。
Output
对于每个测试用例,输出实现至少c卡长度的悬垂所需的最少卡数。使用示例中显示的确切输出格式。
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)
思路
这道题不难,属于水题,先确定题目中所需要的变量,a—读取的长度,c—计算的长的,n—卡片数量,初始直接将n设置为1,c设置为0.5,因为它只要有长度那必然要用一张卡片,第一张卡片的长度就是0.5。然后进行累加,每次加上1/(n+1)的长度。然后与a进行比较,大于a直接输出,然后初始化n,c重新开始计算下一步,按照题目给的方式输出,小于继续循环累加。
AC代码
import java.util.*;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Poj1003 {
public static void main(String[] args) throws Exception{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
double a;
double n=1;
double c=0.5;
a=Double.valueOf(in.readLine());
while(a!=0.00){
while(c<a){
n++;
c=c+1/(n+1);
}
System.out.println((int)n+" card(s)");
c=0.5;
n=1;
a=Double.valueOf(in.readLine());
}
}
}
卡住最长时间的地方
这次卡的时间没有很长,但是这种低级错误也比较蠢,一开始以为题中给的输入格式是一起性全输入,而我输入的时候输入一个数后直接在后面出了一个结果,就很尴尬,以为格式不能通过,通过查阅资料发现,是可以通过,是我想得过于麻烦了。
总结
今天是写博客的第二天,写的速度和做题的速度都变快了,可能是这道题比上一道题要简单吧。坚持下去,总会有收获的。