头歌数据结构与算法课程设计算法与竞赛(第4章)C++与算法基础三◆◇dear丶妖孽╮ゞ

本关任务:给定两个无序数组arr1和arr2,编写一个程序实现这两个数组的升序合并。

为了完成本关任务,你需要掌握:1.升序合并思路,2.Algorithm中的合并函数merge。

要求解两个无序数组的升序合并,自然的,按照升序与合并位置关系,可分为先升序后合并和先合并后升序两种方式,假设数组一的个数为N,数组二的个数为M:

合并数组是一个很常见的操作,例如在归并排序和快速排序的递归求解过程中,就需要将两个有序数组合并成一个。因此通过调用C++Algorithm中模板函数merge,来快速实现这一操作是非常方便有效的。

合并函数的核心思想是设置两个头指针,分别指向两个升序数组首地址,通过比较两个头指针的大小,每次都将小的数值放入新的数组,然后小数值指针后移,最后新的数组也是有序的,从而完成合并过程,复杂度为O(N+M)。其函数原型和应用实例如下:

1\\函数原型2template3OutputIteratormerge(InputIterator1first1,InputIterator1last1,InputIterator2first2,InputIterator2last2,OutputIteratorresult)4{5while(true){6if(first1==last1)returnstd::copy(first2,last2,result);7if(first2==last2)returnstd::copy(first1,last1,result);8*result++=(*first2<*first1)*first2++:*first1++;9}10}11\\应用实例12intarr1[3]={1,2,3};13intarr2[4]={2,3,4,5};14intarr3[7];15merge(arr1,arr1+n1,arr2,arr2+n2,arr3);16\\arr3结果为{1,2,2,3,3,4,5}编程要求本关的编程任务是补全右侧代码片段Merge_Array中Begin至End中间的代码,具体要求如下:

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

以下是平台的测试样例:

16

146575330753236734176409463729

13

18521712909561781927688996

66121417181927293032363740415253576168737576788990949596

第一行整数N第二行N个整数(无序)第三行整数M第四行M个整数(无序)

输出一行,包含N+M个升序整数,末尾换行!!!

开始你的任务吧,祝你成功!

本关任务:给定两个升序数组arr1和arr2,编写一个程序判定数组arr1是否包含数组arr2,例如arr1=[1,2,3,4],arr2=[2,3],则数组arr1包含数组arr2,若arr2=[2,5],则数组arr1不包含数组arr2。

为了完成本关任务,你需要掌握:1.有序数组包含,2.Algorithm中的包含函数includes。

无序数组的包含问题就像是字符串应用中的最长公共子序列,解法是动态规划,而有序数组的包含则是简单的判断问题,解法类似有序数组的合并。

同样的,其核心思想也是设置两个头指针分别指向两个升序数组,若指针指向的元素相等,则两个指针都往后移动,否则指向数组arr1的指针往后移动,直到指针移向数组尾地址。

Algorithm中的包含函数includes是不常用但却又比较实用的函数,它避免了我们编写复杂的代码,同时,模板函数的优势可以让我们自定义数据类型,在数据库等查询任务中是非常方便有效的,其函数原型及应用实例如下:

1\\函数原型2template3boolincludes(InputIterator1first1,InputIterator1last1,InputIterator2first2,InputIterator2last2)4{5while(first2!=last2){6if((first1==last1)||(*first2<*first1))returnfalse;7if(!(*first1<*first2))++first2;8++first1;9}10returntrue;11}12\\应用实例13intarr1[4]={1,2,3,4};14intarr2[2]={2,3};15booljudge(arr1,arr1+4,arr2,arr2+2);16//judge结果为true编程要求本关的编程任务是补全右侧代码片段Include_Array中Begin至End中间的代码,具体要求如下:

11

615252640435462707881

6

62540547081

array1includesarray2

第一行整数N第二行N个整数(升序)第三行整数M第四行M个整数(升序)

若数组arr1包含数组arr2,则输出array1includesarray2,否则输出array1notincludesarray2

本关任务:给定两个集合A和B,编写一个程序实现这两个集合的并集与交集。

为了完成本关任务,你需要掌握:1.集合,2.集合的并,3.集合的交。

集合是由一个或多个确定的元素所构成的整体。集合中的元素有三个特征:

但是本关卡为了在最后方便测试输出集合是否正确,对输出集合做了升序的要求。

集合A和集合B的并是由所有属于集合A或属于集合B的元素所组成的集合,记作AB或者BA,并集的一个重要属性就是越并越多。假定集合A=(1,2,3,4,5,6,7),集合B=(6,7,8,9),那么集合A和集合B的并集为AB=(1,2,3,4,5,6,7,8,9)。

Algorithm算法模板中集成了集合的并操作,函数名称为set_union,其作用是将两个集合合并成一个集合,但是要求输入的两个集合必须是有序的,这看似违背了集合的定义,但是有序的目的是为了让求并的过程实现起来变得简单。因此,在本关卡中,首先需要将两个集合排序,然后才调用set_union函数计算出并集。其函数原型及应用实例如下:输入参数是两个集合的首尾地址以及一个保存并集结果的数组的首地址,最后返回数组尾地址:

1\\函数原型2template3OutputIteratorset_union(InputIterator1first1,InputIterator1last1,InputIterator2first2,InputIterator2last2,OutputIteratorresult)4{5while(true)6{7if(first1==last1)returnstd::copy(first2,last2,result);8if(first2==last2)returnstd::copy(first1,last1,result);9if(*first1<*first2){*result=*first1;++first1;}10elseif(*first2<*first1){*result=*first2;++first2;}11else{*result=*first1;++first1;++first2;}12++result;13}14}15\\应用实例16intarr1[3]={1,2,3};17intarr2[3]={2,3,4};18intarr3[4];19intn=set_union(arr1,arr1+n1,arr2,arr2+n2,arr3)-arr3;20\\arr3结果为{1,2,3,4}21\\n结果为4集合的交集合A和B的交是由所有属于集合A以及属于集合B的元素所组成的集合,记作A∩B或者B∩A,交集的一个重要属性就是越交越少。假定集合A=(1,2,3,4,5,6,7),集合B=(6,7,8,9),那么集合A和集合B的交集为A∩B=(6,7)。

Algorithm算法模板中集成了集合的交操作,函数名称为set_intersection,其作用是将两个集合交成一个集合,同样的要求输入的两个集合必须是有序的。因此,首先需要将两个集合排序,然后才调用set_intersection函数计算出交集。其函数原型及应用实例如下,输入参数是两个集合的首尾地址以及一个保存交集结果的数组的首地址,最后返回数组尾地址:

1\\函数原型2template3OutputIteratorset_intersection(InputIterator1first1,InputIterator1last1,InputIterator2first2,InputIterator2last2,OutputIteratorresult)4{5while(true)6{7if(first1==last1)returnstd::copy(first2,last2,result);8if(first2==last2)returnstd::copy(first1,last1,result);9if(*first1<*first2){*result=*first1;++first1;}10elseif(*first2<*first1){*result=*first2;++first2;}11else{*result=*first1;++first1;++first2;}12++result;13}14}15\\应用实例16intarr1[3]={1,2,3};17intarr2[3]={2,3,4};18intarr3[2];19intn=set_intersection(arr1,arr1+n1,arr2,arr2+n2,arr3)-arr3;20\\arr3结果为{2,3}21\\n结果为2编程要求本关的编程任务是补全右侧代码片段Set_Union和Set_Intersection中Begin至End中间的代码,具体要求如下:

测试输入:

7

1234567

4

6789

预期输出:

Union:9

{1,2,3,4,5,6,7,8,9}

Intersection:2

{6,7}

本关任务:给定两个集合A和B,编写一个程序实现集合B关于集合A的相对差集AB,集合A相对集合B的相对差集BA,以及集合A与集合B的对称差集。

为了完成本关任务,你需要掌握:1.集合相对差集,2.集合对称差集。

集合差集也叫集合补集,是一个相对的定义:由属于A而不属于B的元素组成的集合,称为B关于A的相对补集,记作AB。例如集合A=(1,2,3,4),集合B=(3,4,5,6),那么集合AB=(1,2)。

1\\函数原型2template3OutputIteratorset_difference(InputIterator1first1,InputIterator1last1,InputIterator2first2,InputIterator2last2,OutputIteratorresult)4{5while(first1!=last1&&first2!=last2)6{7if(*first1<*first2){*result=*first1;++result;++first1;}8elseif(*first2<*first1)++first2;9else{++first1;++first2;}10}11returnstd::copy(first1,last1,result);12}13\\应用实例14intarr1[4]={1,2,3,4};15intarr2[4]={3,4,5,6};16intarr3[4];17intn=set_difference(arr1,arr1+n1,arr2,arr2+n2,arr3)-arr3;18\\arr3结果为{1,2}19\\n结果为2集合对称差集集合A与集合B的对称差集定义为属于集合A与集合B,但不属于它们交集A∩B的元素集合,记为A△B。也就是说A△B=x∣x∈A∪B且x∈/A∩B,即A△B=(A∪B)—(A∩B)。同样也可以用相对差集的并来表示A△B=(A—B)∪(B—A)。例如上述的两个集合,他们的对称差集为A△B=(1,2,5,6)。

Algorithm算法模板中集成了集合对称差集的操作,函数名称为set_symmetric_difference,其作用是计算出两个集合的对称差集,同样的,要求输入的两个集合必须是有序的。其函数原型及应用实例如下:

1\\函数原型2template3OutputIteratorset_symmetric_difference(InputIterator1first1,InputIterator1last1,InputIterator2first2,InputIterator2last2,OutputIteratorresult)4{5while(true)6{7if(first1==last1)returnstd::copy(first2,last2,result);8if(first2==last2)returnstd::copy(first1,last1,result);9if(*first1<*first2){*result=*first1;++result;++first1;}10elseif(*first2<*first1){*result=*first2;++result;++first2;}11else{++first1;++first2;}12}13}14\\应用实例15intarr1[4]={1,2,3,4};16intarr2[4]={3,4,5,6};17intarr3[8];18intn=set_symmetric_difference(arr1,arr1+n1,arr2,arr2+n2,arr3)-arr3;19\\arr3结果为{1,2,5,6}20\\n结果为4编程要求本关的编程任务是补全右侧代码片段Set_Difference和Set_Symmetric_Difference中Begin至End中间的代码,具体要求如下:

A-B:5

{1,2,3,4,5}

B-A:2

{8,9}

(A-B)U(B-A):7

{1,2,3,4,5,8,9}

本关任务:给定排列的大小n,计算出从1,2,3,..,n开始的下m个排列,以及从n,..,3,2,1开始的上m个排列,并输出结果。

例如n=3,m=4,那么从1,2,3开始的下4个排列为:1,2,3;1,3,2;2,1,3;2,3,1,从3,2,1开始的上4个排列为:3,2,1;3,1,2;2,3,1;2,1,3。

为了完成本关任务,你需要掌握:1.序列排列,2.Algorithm中下一个排列模板函数,3.Algorithm中上一个排列模板函数。

一般地,从n个不同元素中取出m个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列permutation。特别地,当m=n时,这个排列被称作全排列allpermutation,本关卡就是关于n的全排列问题。

给定一个排列序列,Algorithm中的模板函数next_permutation可以产生该排列的下一个序列,输入参数为序列的首地址和尾地址,其函数模板及应用实例如下:

1\\函数模板2template3boolnext_permutation(BidirectionalIteratorfirst,BidirectionalIteratorlast);4\\应用实例5intmyints[]={1,2,3};6do{7std::cout<

1\\函数模板2template3boolprev_permutation(BidirectionalIteratorfirst,BidirectionalIteratorlast);4\\应用实例5intmyints[]={3,2,1};6do{7std::cout<

THE END
1.直击高频编程考点:数学思维知识及经典算法题总结:当应用数学思维解决问题时,有时可以带来性能提升。以下是几个案例来说明在编程中应用数学思维如何优化性能: 快速幂算法(Exponentiation by Squaring):在计算一个数的幂时,可以利用快速幂算法,将复杂度从O(n)降低到O(log n)。这种算法通过将幂次进行二进制拆解,避免了重复计算,从而大幅提升了计算速度。 https://blog.csdn.net/xiaofeng10330111/article/details/106086200
2.AlphaFold3来了!全面预测蛋白质与所有生命分子相互作用及结构蛋白质设计的底层逻辑与基本规则,学习蛋白质结构预测、蛋白质序列设计、蛋白质-蛋白质相互作用分析、以及蛋白质功能注释和优化方法,掌握深度学习在蛋白质设计中的常见算法以及实际方法,培养学生具备基本的深度学习蛋白质设计能力和蛋白质人工智能应用的前沿视野,为参与解决生物医学、生物工程和生物能源等方面的重大问题提供https://cloud.tencent.com/developer/article/2437597
3.在线扑克如何作弊:一次软件安全研究安全IT业界扑克是一种风靡世界的纸牌游戏,我们不仅可以在家中的餐桌上、赌场上、或者桥牌室中玩扑克,现在还可以在网上玩。我们研究可靠软件技术的一些人 也玩扑克。因为我们现在都会花大量的时间在网上,所以将打扑克和可靠软件技术研究结合在一起只是时间问题。我们将在线扑克游戏和软件安全结合起来研究后, 发现一个巨大的安全漏洞https://www.open-open.com/news/view/54e21b
4.力扣(LeetCode)全球极客挚爱的技术成长平台海量技术面试题库,拥有算法、数据结构、系统设计等 1000+题目,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode-cn.com/
5.上海自考数字媒体艺术概论(14265)自学考试大纲《数字媒体艺术概论》课程是数字媒体艺术专业课程体系中的一门重要的基础课程,是非设计学类、设计艺术类专业毕业的考生参加自学考试必考的课程。设置《数字媒体艺术概论》课程考虑到专升本学生对数字媒体艺术专业的理 论体系和历史发展需有一个完整的掌握,根据《动画、数字媒体艺术、数字媒体 技术专业教学质量国家标准》要求https://www.zikaoben.cn/n/e-9719833081.html
6.天花板编程手把手计划第1期第3天这个算法的特点是不需要回退。 以上两种是数据结构中的经典算法,不过我们今天要讲的并非这两种。所以千万不要被吓到了。 2.2 功能分解 首先说一下,经典的编程问题,每个都有经典的解法。这些解法是很多人共同总结出来的可以解决一类问题的最优算法。然而,对于某一个具体的问题,这些算法并不一定是最优的或者说最简单https://www.jianshu.com/p/e6d4733daca8
7.经典回顾:一文读懂电商供应链的主要KPI考核这个是因为供应链计划和物流部做了分工,物流网络规划(包括设几层仓网、分几个仓、哪些类目哪些货品分仓&分到那一层)和调拨计划是供应链计划负责的,那么他们就要通过合理分仓分货,来降低物流成本且提升履约时效,这点上就考核他们的“本地订单达成率”。物流则集中精力攻克单均物流成本。 https://maimai.cn/article/detail?fid=1769836074&efid=5TktFpLg98SVcKH9FyyS2A
8.系统控制之美控制系统工业自动化控制文章e钱学森在《工程控制论》[5] 中提出“工程控制论是一门技术科学,它不同于工程实践”,“工程控制论的目的是研究控制论这门科学中能够直接用在工程上设计被控系统或被操纵系统的那些部分”,“控制论所讨论的主要问题是一个系统的各个不同部分之间的相互作用的定性性质,以及整个系统总的运动状态”。这本经典著作于1956https://articles.e-works.net.cn/control_system/article154136.htm
9.重建生态:价值与系统的力量——第七届中国教育创新年会11月启幕我们必须从这些底层的逻辑,演绎出思维的脚手架、行动的工具箱,系统的方法论,人人参与,去搭建我们重构教育、解决问题的操作支点与行动空间,并推动我们自己分析现象,理清逻辑,有效行动。 我们必须以系统的设计,生态的视野,重建教育价值,在2020这个划时代的转折时刻,展开一场严肃的讨论:教育的基础价值和根本目标,究竟是https://sghexport.shobserver.com/html/toutiao/2020/08/26/250533.html
10.2020届计算机科学方向毕业设计(论文)阶段性汇报在本次汇报中,我将介绍毕设课题选定的视频分析具体任务:时序动作检测(Temporal Action Proposal)的相关内容,包括任务背景、最近研究成果、数据情况以及切入点等。我还将汇报过去一阶段的工作内容和下一阶段的工作计划。 范舟 基于强化学习的推荐与广告合并算法设计 https://zhiyuan.sjtu.edu.cn/html/zhiyuan/announcement_view.php?id=3709
11.算法题目总结1qq63f87738d96a0的技术博客棋盘格问题(还未懂)UVa1343 拓扑排序 排序算法 归并排序: 快速排序: 三分切向的快速排序(算法 P201) 模仿二分查找设计一个三分查找 贪心算法 https://blog.51cto.com/u_15980129/6084433
12.计算力学快讯,第8卷,第11期计算力学快讯计算力学快讯简介:本快讯是分享计算力学及相关软件信息的一个交流平台;由河海大学工程与科学数值模拟软件中心、江苏省力学学会信息服务部、中国力学学会计算力学软件专业组、南昌大学航空航天研究院联合主办;免费订阅,自由退订;欢迎各位计算力学同仁的投稿和反馈意见。 http://jsstam.org.cn/?list_73/1112.html
13.鸡兔同笼教案集合10篇教学中,我们把《孙子算经》中关于鸡兔同笼问题的原题和《孙子算经》中用“抬腿法”这种特殊而灵巧的方法解决这一问题的过程,用课件科学而生动地再现于课堂,极大地激发和调动了学生的探究兴趣,充分地传承和弘扬了经典的数学文化,较好地体现和提升了课堂的.教学品味。https://www.unjs.com/fanwenwang/jiaoan/20230425163257_6948734.html
14.高中数学新课标研读心得体会(精选13篇)无论是软件还是硬件都离不开算法的设计,算法原为计算机程序设计的组成部分,现在把它放到高中数学课本的必修部分,充分体现了新课标重应用、重能力的思想。算法严格地说是数学的一个分支,然而算法的相关概念比较枯燥,理论过于抽象,对学生的能力要求较高,所以在教学过程中往往难以把握,也不容易引起学生的兴趣,俗话说"https://www.ruiwen.com/word/gaozhongshuxuexinkebiaoyanduxindetihui.html
15.百度笔试题目及答案现在要求设计一个算法, 给定一个数k 判断出k是否在这个矩阵中。 描述算法并且给出时间复杂度(不考虑载入矩阵的消耗) 算法思想: 沿着对角线查找,获得i,使得k位于a[i][i]与a[i+1][i+1]之间。 k只可能存在于a[i][i]对应的右上角矩阵 和a[i+1][i+1]对应的左下角矩阵。 https://yjbys.com/bishi/timu/745487.html
16.算法决策:人工智能驱动的公共决策及其风险*【内容提要】作为一种自主算法决策,人工智能技术已经渗透到公共决策过程的各个环节,使公共决策模式产生重大变革。本文基于公共政策循环理论的视角,提出了一个人工智能算法对公共政策的问题界定与议程设置、政策制定、政策执行和政策评估四个阶段的影响与应用的分析框架,指出人工智能算法通过其大数据处理能力和预测分析能力,对https://www.opentimes.cn/html/Abstract/20842.html
17.《中国移动应用设计趋势解读》经验/观点一个有趣的事实:在QQ里面,你能推拽任意一个数字标记(不是不明确标记),然后它就会像烟雾一样消失。(译者注:参见QQ手机版 5.0“一键下班”设计小结) 3.封闭系统、门户、平台 Richard Gabriel的经典论文《“越差的越好”的崛起》(The Rise Of “Worse is Better”),第一次将软件设计中两种对立观点进行对比: https://www.ui.cn/project.php?id=33849
18.腾讯万字干货!如何让设计创新源源不断?(激进篇)优设网在哪里(Where) “这个问题发生在哪里?之前在哪里解决?还有哪里有相似的问题? ” 在何时(When)“这个问题何时发生?问题何时开始?何时可以解决?” 如何(How)“如何解决?已经尝试了哪些解决办法?” 5 个为什么(5Why) 经典的连问 5 个为什么。如果我们针对看到的结果,只问一个“为什么”,很容易停https://www.uisdc.com/incremental-change-2