其实这道题目可以用二分做,但打表感觉更加方便,因为这道题目给你的数据是一个精确到小数点后两位的小数,那么我们乘以100就一定可以得到一个整数,因此只要申请一个数组之后把相应答案存储即可。接着只要一问一输出即可。
| Time Limit: 1000MS |
| Memory Limit: 10000K |
| Total Submissions: 84229 |
| Accepted: 40517 |
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
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)
Source
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
#define eps 1e-8
double l,s,tag;
int cnt,ans[1100];
int sig(double k)
{
if(fabs(k)<eps)
return 0;
return (k>0)?1:-1;
}
int main()
{
s=0;
memset(ans,-1,sizeof(ans));
for(int i=1;i<=520;i++)
{
cnt=1,s=0.5,tag=(i*1.0)/100;
for(;;)
{
if(sig(s-tag)>=0)
{
ans[i]=cnt;
break;
}
cnt++;
s+=1.0/(cnt+1);
}
}
while(~scanf("%lf",&l))
{
if(sig(l-0)==0)
break;
printf("%d card(s)\n",ans[(int)(l*100)]);
}
return 0;
}
本文介绍了一种利用二分查找与打表技巧解决卡片堆叠问题的方法,通过将浮点数转换为整数进行精确计算,优化了算法效率并实现了快速解答。

383

被折叠的 条评论
为什么被折叠?



