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