题目大意:
你可以把一叠卡片悬放于离桌子多远的地方(如果所有卡片均相同的话,并且卡片边缘于桌子边缘垂直)?
如果只有一张卡片,那么它最多可以悬垂超出桌子半张卡片的长度,如果有两张卡片,则最上面一张可以超出下面一张1 / 2卡片长度,而地下那张可以超出桌子1 / 3卡片长度,因此总共超出桌子1 / 2 + 1 / 3卡片长度,以此类推,n张卡片总共可以超出桌子1 / 2 + 1 / 3.... + 1 / ( n + 1 )的卡片长度。
有多个测例,每个测例都给出一个c(0.01 ≤ c ≤ 5.20,c只包含3个数字),即卡片可以超出桌子的最大长度(以单张卡片的长度为单位),现求超出该长度的最少卡片数量,以c等于0.00为终止。
注释代码:
/*
* Problem ID : POJ 1003 HangOver
* Author : Lirx.t.Una
* Language : GCC
* Run Time : 0 ms
* Run Memory : 176 KB
*/
#pragma GCC optimize("O2")
#include <stdio.h>
//maximum N,最大记录数,经计算而得的结果
#define MAXN 276
float sum[MAXN] = { 0.0 };//sum[i]记录了i张卡片可以超出桌子的最大长度
int
main() {
float c;//题给的可超出桌子的最大长度
int i;//记录卡片数量
while ( scanf("%f", &c), c ) {
i = 1;
while (1) {
if ( !sum[i] )//如果最大长度还没计算过则计算
sum[i] = sum[i - 1] + 1.0 / ( i + 1 );
if ( sum[i] >= c )//若刚好超过题给最大长度则可以直接输出结果
break;
i++;
}
printf("%d card(s)\n", i);
}
return 0;
}
无注释代码:
#pragma GCC optimize("O2")
#include <stdio.h>
#define MAXN 276
float sum[MAXN] = { 0.0 };
int
main() {
float c;
int i;
while ( scanf("%f", &c), c ) {
i = 1;
while (1) {
if ( !sum[i] )
sum[i] = sum[i - 1] + 1.0 / ( i + 1 );
if ( sum[i] >= c )
break;
i++;
}
printf("%d card(s)\n", i);
}
return 0;
}
单词解释:
hang:vt, 悬挂
hang over:vt, 笼罩
hangover:n, 宿醉
a stack of:一堆,一叠
overhang:vt, 悬垂于...之上
perpendicular:adj, 垂直的; n, 垂线
A be perpendicular to B:A垂直于B
illustrate:vt, 阐明,举例说明
figure:n, 图形