虫子爬进问题

来源:互联网 发布:javabean连接数据库 编辑:程序博客网 时间:2024/05/17 02:14

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 一部分

原创粉丝点击