虫子爬进问题

1.问题大意
    一个n英寸的井中有一条1英寸的虫。虫子u英寸/minutes,爬一分钟必须休息一分钟。休息期间虫子会掉d英寸。给出需要多少秒一个虫爬出井。
    题意的理解很重要,开始时我理解为必须刚好最后一步到达井口,才算爬出井。所以对立面 n=19、u=3、d=1时间为19的例子算了半天都没有找到一个合理的到达井口的走法。后来看题解,发现并不是刚好到达,只要最后一部能大于等于n也算到达。
2.循环减法

方法:

    将n与u比较,如果n小于等于u这说明下一步可以一步出井,否则需要跳一步滑下一下,两秒钟。然后再进行上面的判断。

代码:

#include <iostream>
using namespace std;
int main()
{
    int n,u,d;
    while(cin>>n>>u>>d&&n){
        int ans = 0;
        while(n>u){
            n=n-u+d;
            ans+=2;
        }
        ans++;
        cout<<ans<<"\n";
    }
    return 0;
}
3.数学计算法
方法: ans = 向上取整[(n-u)/(u-d)]*2+1
向上取整[(n-u)/(u-d)] = [(n-u+u-d-1)/(u-d)] = [(n-d-1)/(u-d)]
即:ans = [(n-d-1)/(u-d)]
为什么要上去整:最后一步肯定小于等于u,因此n-u表示走一步掉一步能到达的高度。因为u>d,所以如果a=(n-u)/(u-d)不是整数的话如果下取整,那么跳a*2步,剩下的距离大于u所以不能一步跳上去,还需要再跳一步才能到达。如果有小数时上取整,第a*2-1步是不是到达井口的,所以可以放心跳,同时最后一步也可以到达井口。
参考

[1] 题目来源hdu 1049

生词

inch 英寸 worm 虫 well 井 climb 爬 portion 一部分

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值