算法设计与分析:枚举和递推的运用

news2024/7/6 20:22:43

目录

第1关:双关系递推数列

任务描述

相关知识

枚举算法的两种框架

递推算法的实施步骤

问题求解思路

编程要求

测试说明


第1关:双关系递推数列

任务描述

本关任务:运用枚举和递推的基本思想,通过编程计算出双关系递推数列。设集合 M 定义如下:

1.初始 1∈M;

2.若x∈M,则有2x+1∈M,5x−1∈M;

3.再无其它的数属于M。

试求集合M中的元素从小到大排列后所得序列的第n项,其中n<10001。

相关知识

为了完成本关任务,你需要掌握:1.枚举算法的两种框架,2.递推算法的实施步骤,3.问题求解思路。

枚举算法的两种框架

枚举的本质就是从所有的备选答案中去查询正确的解。一般的,使用枚举算法需要满足两个基本条件:

  • 备选答案的数量是确定的或是有限个数的;
  • 备选答案的范围在求解之前也应该是确定的。

枚举算法有两种常见的框架:区间枚举和递增枚举。它们在不同的任务中都有着各自的优势。

区间枚举的主要思想是对于一个给定的闭区间,从该区间的下限一直逐个枚举到该区间的上限,其伪代码如下所示:

  1. n=0;
  2. for(k=<区间下限>;k<=<区间上限>;k++)
  3. {
  4. <运算操作序列>;
  5. if(<约束条件>)
  6. {
  7. printf(<满足要求的解>);
  8. n++;
  9. }
  10. }
  11. printf(<解的个数>);

递增枚举的主要思想是从给定的枚举起点开始,一直逐个枚举,直到找到满足条件的解,程序结束,其伪代码如下所示:

  1. k=<枚举起点>
  2. while(1)
  3. {
  4. k++;
  5. <运算操作序列>;
  6. if(<约束条件>)
  7. {
  8. printf(<满足要求的解>);
  9. return;
  10. }
  11. }

递推算法的实施步骤

递推的定义:给定一个数的序列H0​,H1​,...,Hn​,...,若存在整数n0​,使当n>n0​时,可以用等号(或大于号、或小于号)将Hn​与其前面的某些项Hi​,i∈[0,n0​]联系起来,这样的式子就叫做Hn​的递推式。递推算法的具体实施步骤如下:

  1. 确定递推变量:递推变量可以是简单变量,也可以是一维或多维数组;
  2. 建立递推关系:递推关系是递推的依据,是解决递推问题的关键;
  3. 确定初始值和边界条件:根据问题最简单情形的数据,确定递推变量的初始值和边界条件,这是递推的基础;
  4. 对递推过程进行控制:和枚举算法互相配合,完成递推问题的求解。

问题求解思路

该问题已经给出了递推变量x和递推关系2x+1,5x−1,以及初始值为x=1,但是不知道边界条件,也就是说要递推出足够多的项,然后才能找到排序后的第n项。

借助从小到大排序这一限制条件,我们可以设置两个变量,分别控制递推关系2x+1和5x−1的递推进程,使得依次递推出的序列是有序的,那么边界条件即为第n项递推的结束。

例如n=10时,通过递推可以得到第10项为31,具体步骤如下:

1.第1步:给定数组m,从下标1开始存储有序递推数列,初始值m[1]=1,设定p2​=p5​=1,分别表示递推关系F2​(x)=2x+1和F5​(x)=5x−1的上一项递推变量x在数组m中的索引。

2.第2步:分别计算两个递推式的值,若F2​(m[p2​])<F5​(m[p5​]),则数组m的第i=2项为m[2]=F2​(m[p2​]),并更新p2​=p2​+1;若F2​(m[p2​])>F5​(m[p5​]),则数组m的第i=2项为m[2]=F5​(m[p5​]),并更新p5​=p5​+1;若F2​(m[p2​])=F5​(m[p5​]),则数组m的第i=2项为m[2]=F2​(m[p2​]),并更新p2​=p2​+1,p5​=p5​+1。

3.第3步至第n步:按照第2中的递推过程,依次递推出第3项,第4项,直到第n项的值。

 

编程要求

本关的编程任务是补全右侧代码片段mainBeginEnd中间的代码,具体要求如下:

  • main中,根据枚举和递推的基本思想,计算出双关系递推数列的前n项,并从小到大存储到数组m中,下标从1开始,即第一项为m[1]=1

测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:10 预期输出:31

//
//  main.cpp
//  step2
//
//  Created by ljpc on 2018/12/8.
//  Copyright © 2018年 ljpc. All rights reserved.
//

#include <iostream>
#include <cstdio>

int main(int argc, const char * argv[]) {
 
    long long m[10001];     // 数组:从小到大保存的集合M的元素
    int n;                  // 查询第n项
    int p2;                 // F2(x)=2x+1的索引指针
    int p5;                  // F5(x)=5x-1的索引指针
    
    scanf("%d",&n);
    
    m[1]=1;
    p2=1;
    p5=1;
    
    // 请在这里补充代码,完成本关任务
    /********* Begin *********/
    int sum = m[1];
	for(int i=2;i<=n;i++){
		int tmp2 = 2*m[p2]+1;	
		int tmp5 = 5*m[p5]-1;
		if(tmp2>tmp5){
			m[i] = tmp5;
			p5++;
		}
		else if(tmp2<tmp5){
			m[i] = tmp2;
			p2++;
		}
		else{
			m[i] = tmp2;
			p2++;
			p5++;
		}
		sum+=m[i];
	} 
    /********* End *********/

    
    printf("%lld\n",m[n]);
 
    return 0;
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

grafana + influxdb + telegraf构建linux性能监控平台

为了更好的做性能测试过程中监控服务器资源&#xff0c;提供可视化效果&#xff0c;下面介绍一种监控方案&#xff1a; grafana influxdb telegraf , 构建linux性能监控平台 安装3个软件 1.Grafana安装 grafana , 访问各类数据源 , 自定义报表、显示图表等等 , 用于提供界…

微星 B360M MORTAR电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板微星 B360M MORTAR 处理器英特尔 Core i5-9400 2.90GHz 六核已驱动 内存8 GB ( 金士顿 DDR4 2666MHz 8GB )已驱动 硬盘西数 WDS250G3X0C-00SJG0…

mysql高级语句(2)

and or 最左原则 create view视图表&#xff1a;虚拟表或存储查询 没有表结构存储查询语句的结果表 临时表在用户退出或同数据库连接断开就会小时&#xff0c;而视图表不会&#xff08;就像定义个全局变量&#xff09;保存的是定义 格式&#xff1a;create view “视图表名…

内测开始了!0penAI GGPT 图片功能、联网功能、音频功能、多模型功能、微调功能

联合两位大佬一起对gpt官方的接口做了整合。 有感兴趣的可以一起开发交流&#xff0c;下文有部分代码讲解。感兴趣的可以加入一起测试玩耍&#xff08;文末有加入方式&#xff09;~ 模型介绍 内测内容包括文字生成图片、图片生成图片、联网模式、模型定制、多角色设定等。 1…

mongodb用户权限配置

1.副本集 1.1在主节点创建管理员账号 /etc/mongodb/mongosh-1.8.1-linux-x64/bin/mongosh --port 27017 use admin db.createUser({user:"用户名",pwd:"密码",roles:["root"]}) 只要在主节点创建用户即可&#xff0c;从节点会自动同步数据 …

Verilog语法之generate (for、 if、 case)用法

文章目录 前言一、宏定义二、generate 方法1. generate-if 方法1. generate-case方法 三、小知识&#xff08;语法模板&#xff09; 前言 对于同一功能多种不同实现方法的模块代码如何整合到一起呢&#xff1f;当然每种方法作为一个单独的模块使用一个.v 文件保存肯定是没有问…

MySQL 高级(进阶) SQL 语句二

一、表连接查询 MYSQL数据库中的三种连接&#xff1a; inner join(内连接)&#xff1a;只返回两个表中联结字段相等的行&#xff08;有交集的值&#xff09;left join(左连接)&#xff1a;返回包括左表中的所有记录和右表中联结字段相等的记录right join(右连接)&#xff1a;…

区间合并(算法)

目录 题目代码实现注意点 题目 给定 n n n 个区间 [ l i , r i ] [l_i, r_i] [li​,ri​]&#xff0c;要求合并所有有交集的区间。 注意如果在端点处相交&#xff0c;也算有交集。 输出合并完成后的区间个数。 例如&#xff1a; [ 1 , 3 ] [1,3] [1,3] 和 [ 2 , 6 ] [2,…

【利用AI让知识体系化】深入浅出HTTP(近2w字)

思维导图 文章目录 思维导图1. HTTP基础知识HTTP简介URI和URLHTTP的请求和响应 2. HTTP请求请求方法请求头请求体 3. HTTP响应响应状态码响应头响应体 4. Cookies和SessionCookies的原理和应用Session机制使用Cookies和Session进行用户认证 5. HTTP缓存缓存概述浏览器缓存服务器…

Tomcat源码:连接器与Executor、Connector

前文&#xff1a; 《Tomcat源码&#xff1a;启动类Bootstrap与Catalina的加载》 《Tomcat源码&#xff1a;容器的生命周期管理与事件监听》 《Tomcat源码&#xff1a;StandardServer与StandardService》 《Tomcat源码&#xff1a;Container接口》 《Tomcat源码&#xff1a…

NHWC和NCHW数据排布及转换(模型部署)

1.概念 首先这是两种批量图片的数据存储方式&#xff0c;定义了一批图片在计算机存储空间内的数据存储layout。N表示这批图片的数量&#xff0c;C表示每张图片所包含的通道数&#xff0c;H表示这批图片的像素高度&#xff0c;W表示这批图片的像素宽度。其中C表示的通道数可能有…

被热议的DataOps,到底是什么?

近几年&#xff0c;DevOps的火热程度日渐高涨&#xff0c;同时涌现出了各种Ops&#xff0c;包括DevSecOps、GitOps、AIOps、NoOps、DataOps、MLOps、FeatureOps、ModelOps、FinOps等等。其中&#xff0c;对于企业来说&#xff0c;确保数据以高效和合规的方式使用&#xff0c;Da…

git commit 设置 eslint + pretter 格式化校验

系统版本 node 版本: v14.17.5 npm 版本: 6.14.14 vue-cli 版本: vue/cli 4.5.19 目录 系统版本 1. 新建一个 vue2.X 空项目 2. 安装插件 eslint ,并初始化 eslint 配置,根目录生成 .eslintrc 配置文件 3. 测试 eslint 配置 4. 安装 husky、lint-staged 5. 在package.j…

【Linux从入门到精通】了解冯诺依曼体系结构

本片文章会对冯诺依曼体系结构进行详解。同时&#xff0c;我们对冯诺依曼的理解&#xff0c;不能停留在概念上&#xff0c;要深入到对软件数据流理解上。本片文章同时也会对数据在冯诺依曼结构上的交互进行讲解。希望本篇文章会对你有所所帮助。 文章目录 一、简单认识冯诺依曼…

牛客网面试必刷:BM17 二分查找-I

牛客网面试必刷&#xff1a;BM17 二分查找-I 前言一、什么是二分查找&#xff1f;二、二分查找具体代码1.第一种写法&#xff1a;left < right2.第二种写法&#xff1a;left < right 三、复杂度分析 前言 二分查找是一个常见、基础、难度较低问题&#xff0c;本文记录了…

【JMeter入门】—— JMeter介绍

1、什么是JMeter Apache JMeter是Apache组织开发的基于Java的压力测试工具&#xff0c;用于对软件做压力测试。它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 &#xff08;Apache JMeter是100%纯JAVA桌面应用程序&#xff09;Apache JMeter可以用于对静…

linux系统挂载硬盘

linux系统挂载硬盘 1、背景2、环境3、准备工作4、挂载分区4.1、查看分区信息4.2、创建分区4.3、设置分区格式4.4、创建挂载目录4.5、挂载分区4.6、设置开机自动挂载4.7、验证是否挂载成功 1、背景 日常使用过程中随着系统业务量的新增对磁盘的空间和性能提出了更高的要求&…

功能测试之设计语言测试:功能测试包含哪些测试?分别有什么作用

Web 设计语言版本的差异可以引起客户端或服务器端严重的问题&#xff0c;例如使用哪种版本的HTML 等。当在分布式环境中开发时&#xff0c;开发人员都不在一起&#xff0c;这个问题就显得尤为重要。除了HTML 的版本问题外&#xff0c;不同的脚本语言&#xff0c;例如Java、Java…

按照这6步学习测试,月薪不过万,我给你介绍测试工作

上周一刚入职不久&#xff0c;是在上海的一家软件公司&#xff0c;税前11K&#xff0c;五险一金&#xff0c;996的工作制&#xff0c;已经上班了一个月&#xff0c;说下自己的感受。 因为我专科毕业4年&#xff0c;之前一直在做电商运营&#xff0c;大专学的专业是电子商务&am…

Linux上Nacos基本使用:连接MySQL并修改密码、启动、停止命令等

Nacos如何连接MySQL并修改密码 说明如何将内嵌数据库Derby切换为MySQL数据库直接新建MySQL数据库: 必须是MySQL5.7及以上 如何修改密码启动、停止命令 说明 nacos默认&#xff1a; 使用内嵌的数据库&#xff08;Derby&#xff09;默认登录地址 ip:8848/nacos; 账号&#xff1…