PTA基础编程题目集——爬动的蠕虫

原题链接https://pintia.cn/problem-sets/14/problems/797

这题一开始考虑时犯了一些错误,一开始是这样考虑的,按题目的意思,每2分钟蠕虫爬行的距离是(U-D)寸。那么平均每分钟爬行的距离是(U-D+1)/2寸。然后对照样例数据N=12,U=3,D=1算出需要8分钟爬完,当然这个结果是错的。调整一下思路,假设时间为t,爬行距离为s。当t=0时,s=0;当t=1时,s=U;当t=2时,s=U-D;当t=3时,s=U-D+U;当t=4时,S=U-D+U-D;.......所以,可以根据s和t的关系得出以t为自变量关于s的函数关系f(t),这是个分段函数,当t%2==0时,f(t)=(t/2)(U-D);当t%2==1时,f(t)=f(t-1)+U。这里有个递归的形式,因为当t%2==1时,t-1肯定是偶数,所以可以进一步将t-1代入f(t)=(t/2)(U-D)得出当t为奇数时f(t)=((t-1)/2)(U-D)+U。

有了函数关系,就可以写代码了,代码如下:

 1 #include <stdio.h>
 2 int main(void){
 3     int t = 0, s, n, u, d;      //t表示时间,s表示爬行距离
 4     scanf("%d %d %d", &n, &u, &d);
 5     while(1){
 6         if(t % 2 == 0){
 7             s = (t / 2)*(u - d);
 8         }else{
 9             s = ((t - 1) / 2) * (u - d) + u;
10         }
11         if(s >= n){          //当爬行距离大于指定距离,跳出循环
12             break;
13         }
14         t++;
15     }
16     printf("%d\n", t);       //打印所花费的时间
17     return 0;
18 }    

如果直接采用递归形式,代码如下:

 1 #include <stdio.h>
 2 int distance(const int t, const int u, const int d);
 3 int main(void){
 4     int t, s, n, u, d;
 5     scanf("%d %d %d", &n, &u, &d);
 6     for(t = 0; ; t++){
 7         s = distance(t, u, d);
 8         if(s >= n){
 9             break;
10         }
11     }
12     printf("%d\n", t);
13     return 0;
14 }
15
16 //计算指定时间点爬行的距离
17 int distance(const int t, const int u, const int d){
18     if(t % 2 == 0){
19         return (t / 2)*(u - d);
20     }else{
21         return distance(t - 1, u, d) + u;
22     }
23 }

原文地址:https://www.cnblogs.com/zhang-15-506/p/12355143.html

时间: 2024-10-31 16:42:15

PTA基础编程题目集——爬动的蠕虫的相关文章

PTA 基础编程题目集 -函数12题

 4-1 简单输出整数   (10分) void PrintN(int N) { int i,sum=0; for(i=1; i<=N; i++) printf("%d\n",i); } 4-2 多项式求值   (15分) double f( int n, double a[], double x ) { int i; double sum; for(i=0; i<=n; i++) { if(i==0) sum+=a[i]; else if(i==1) sum+=a[i

PTA基础编程题目集7-1厘米换算英尺英寸

如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048.现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸. 输入格式: 输入在一行中给出1个正整数,单位是厘米. 输出格式: 在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开. 输入样例: 170 输出样例: 5 6 1 #include <stdio.h> 2 int main(int argc, char const *arg

PTA基础编程题目集6-3简单求和 (函数题)

6-3 简单求和 (10 分) 本题要求实现一个函数,求给定的N个整数的和. 函数接口定义: int Sum(int List[],int N) 其中给定整数存放在数组List[]中,正整数N是数组元素个数.该函数须返回N个List[]元素的和. 裁判测试程序样例: #include <stdio.h> #define MAXN 10 int Sum ( int List[], int N ); int main (){ int List[MAXN], N, i; scanf("%d

PTA基础编程题目集6-7 统计某类完全平方数 (函数题)

本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144.676等. 函数接口定义: int IsTheNumber ( const int N ); 其中N是用户传入的参数.如果N满足条件,则该函数必须返回1,否则返回0. 裁判测试程序样例: #include <stdio.h> #include <math.h> int IsTheNumber ( const int N ); int main() { int n1, n2, i,

PTA基础编程题目集(四)

直接插入排序,希尔排序 求大数阶乘: // 1000 的阶乘 2568 位 #include <stdio.h> int a[3000]; void show(int k) { int i=0; printf("位数 %d 位\n",k); for (i=k-1; i>=0; i--) { printf("%d",a[i]); } } int fanc(int n) { int w=0; int i=0, j=0; int t=n; int k=0

循环-07. 爬动的蠕虫

循环-07. 爬动的蠕虫(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 一条蠕虫长1寸,在一口深为N寸的井的底部.已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬.在休息的过程中,蠕虫又下滑了D寸.就这样,上爬和下滑重复进行.请问,蠕虫需要多长时间才能爬出井? 这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了.初始时,蠕虫是趴在井底的(即高度为0). 输入格

循环-07. 爬动的蠕虫(15)

1 #include<iostream> 2 using namespace std; 3 int u,d; 4 int sum(int t){ 5 if(t%2==0) 6 return (u-d)*t/2; 7 else 8 return u*(t/2+1)-d*t/2; 9 } 10 int main(){ 11 int t,n; 12 cin>>n>>u>>d; 13 for(t=1;sum(t)<n;) 14 t++; 15 cout<

7-17 爬动的蠕虫(15 分)

一条蠕虫长1寸,在一口深为N寸的井的底部.已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬.在休息的过程中,蠕虫又下滑了D寸.就这样,上爬和下滑重复进行.请问,蠕虫需要多长时间才能爬出井? 这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了.初始时,蠕虫是趴在井底的(即高度为0). 输入格式: 输入在一行中顺序给出3个正整数N.U.D,其中D<U,N不超过100. 输出格式: 在一行中输出蠕虫爬出井的时间,以分钟为单位. 输入样

大数据学习初体验:Linux学习+Shell基础编程+hadoop集群部署

距离上次博客时间已经9天,简单记录下这几天的学习过程 2020-02-15 10:38:47 一.Linux学习 关于Linux命令,我在之前就已经学过一部分了,所以这段时间的linux学习更多的是去学习Linux系统的安装以及相关配置多一些,命令会一些比较常用的就够了,下面记录下安装配置Linux系统时的注意事项. 这里配置的虚拟机的内存为4g 使用的 CentOS-6.5-x86_64-minimal.iso 映射文件 在进入linux系统中时,需要将虚拟机的主机名修改成自己想要的名字,还要