7-17 爬动的蠕虫
1.题目
一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?
这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。
输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。
输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。
输入样例:
12 3 1
输出样例:
11
2.分析
3.代码
尝试1:(❌) 原因:min的赋值错误
#include <stdio.h>
int main()
{
int N,U,D,min;
scanf("%d %d %d",&N,&U,&D);
min=N/(U-D)*2-1;
for(;;min+=2)
{
if((U-D)*(min-1)+D>=N)
{
printf("%d",min);
break;
}
}
return 0;
}
尝试2:(❌) 原因:min的赋值错误
#include <stdio.h>
int main()
{
int N, U, D, min;
scanf("%d %d %d", &N, &U, &D);
if (U >= N)
{
min = 1;
printf("%d", min);
}
else
{
min = N / (U - D) * 2 - 1;
for (;; min += 2)
{
if ((U - D) * (min - 1) + U >= N)
{
printf("%d", min);
break;
}
}
}
return 0;
}
正确方法1:(只考虑奇数)
#include <stdio.h>
int main()
{
int N, U, D, min;
scanf("%d %d %d", &N, &U, &D);
for (min=1;; min += 2)
{
if ((U - D) * (min - 1)/2 + U >= N) //计算第min天(上爬)的路程并与井深比较
{
printf("%d", min);
break;
}
}
return 0;
}
正确方法2:(分奇偶)
#include <stdio.h>
int main()
{
int N, U, D, min=1,distance=0;
while(scanf("%d %d %d", &N, &U, &D))
{
if(min%2)
{
distance+=U;
if(distance>=N)
{
printf("%d",min);
break;
}
}
else
distance-=D;
min++;
}
return 0;
}
正确方法3:(优化方法2) (分开算)
#include <stdio.h>
int main()
{
int N, U, D, min=1,distance=0;
while(scanf("%d %d %d", &N, &U, &D))
{
//先上升
distance+=U;
if(distance>=N)
{
printf("%d",min);
break;
}
min++;
//再下降
distance-=D;
min++;
}
return 0;
}
4.总结
要找好循环的起始、运行、终止条件!
推荐方法3,占用内存较少
5.更新日志
2022.3.11 整理