zju1045-HangOver

本博客介绍了一个算法,用于确定为了达到指定的距离,需要的最少卡片数量。通过逐步累加每张卡片能够提供的额外距离,直到总和超过目标距离。详细解释了算法逻辑,并提供了代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ZJU1045-HangOver(解题来自《ACM国际大学生程序设计竞赛题解(1)》

【题目大意】

  你可以把一叠卡片放得离桌子多远?如果有一张卡片,那么可以达到的最远距离是卡片长度的一半。(假设卡片必须与桌子的边缘垂直。)使用两张卡片,使上面一张能放到的最远距离超过下面一张卡片长度的一半,而下面一张超过桌面的是卡片长度的1/3,所以能达到的最远距离是1/2+1/3=5/6的卡片长度。

  一般来说,n张卡片能达到的最远距离是1/2+1/3+1/4+...+1/(n+1),也就是最顶上的卡片超过第二张1/2,第二张超过第三张1/3,第三张超出第四张1/4,等等,最后一张超出桌子的1/(n+1)。如题目的图。

  输入有多组测试例,当一行是数字0.00时表示输入结束。每个测试例一行,是一个浮点数c(0.01<=c<=5.20),c刚好是3位数字。

  对每个测试例,输出达到距离c所需要的最少的卡片数量,输出格式如样例所示。

【算法分析】

  题目给出卡片超过桌子边缘所能达到的最远距离c,是一个浮点数,且保留2位小数,然后计算需要的最少的卡片数量n。计算公式是:

                                1/2+1/3+1/4+...+1/(n+1)<=c

  使用一个循环语句,逐渐累加,知道上式左边的和超过c时,就可以将n计算出来。

【代码如下】:

  

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    float c;
    while(scanf("%f",&c)&&c!=0)
    {
        int i=2;
        float result=0;
        while(result<=c)
        {
            result+=1.00/i;
            i++;
        }
        printf("%d card(s)\n",i-2);
    }
    return 0;
}

 

          

转载于:https://www.cnblogs.com/cdu-acm/archive/2013/05/07/3065986.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值