热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

第二届全国大学生算法设计与编程挑战赛(春季赛)正式赛题解&比赛回顾

前言很幸运地拿到了rank1!感谢主办方老板(这次rank1主要还是运气不错,第二次打ACM赛制就碰上了配合这么默契的队友,然后关键题都做得比较顺利。比赛回顾咕咕咕题解题解会尽量照

前言

很幸运地拿到了 rank 1!感谢主办方老板(

这次 rank 1 主要还是运气不错,第二次打 ACM 赛制就碰上了配合这么默契的队友,然后关键题都做得比较顺利。


比赛回顾

咕咕咕


题解

题解会尽量照顾到所有水平的选手,会很通俗易懂 =w=

如果我没更新记得私信/QQ催我!


Overall




















































题目编号ABCDEFGHIJKL
思维难度0310522064?0
实现难度0111322173?0

所有难度均从 \(0\)\(10\) 打分。


Problem A 智慧果



题面

已知序列 $a$:



  • \(a_1=1,a_2=2,a_3=3\)

  • \(a_i=a_{i-1}a_{i-2}a_{i-3}+a_{i-1}+a_{i-2}+a_{i-3}\)

\(a_{1000}\)\(100000\) 取模的值。




题解

暴力计算每一项对 $100000$ 取模的值即可。

时间复杂度 \(O(n)\),其中 \(n\) 为项数。


代码


Problem B Xanadu



题面

给定一个 $n\times n$ 的 $01$ 矩阵,和 $n$ 个点的图。你可以花费 $1$ 的代价将矩阵中的一个 $1$ 变成 $0$。

操作完成后,记第 \(i\) 行从左到右第一个为 \(1\) 的位置为 \(j\),则在图上从 \(i\)\(j\) 之间连一条有向边。

问至少要花费多少代价,才能让图上存在一条从 \(1\)\(n\) 的路径,如果无法达成输出 \(-1\)

\(n\leq 300\)




题解

不难发现最后得到的一定是一棵基环树,因此如果有路径,必然存在一条无环的路径,即每个点仅经过一次。

我们对于矩阵建图。假设第 \(i\) 行的第 \(j\) 个位置是该行第 \(k\)\(1\),我们就从 \(i\)\(j\) 建一条费用为 \(k-1\) 的边。

不难发现,最后得到的每条从 \(1\)\(n\) 的路径的边权总和就是这个方案要花费的代价,因此直接在原图上跑最短路即可。

时间复杂度 \(O(n^2)\)\(O(n^2\log n)\)


代码


Problem C 这是一道大难题



题面

给定一张图,求其必须包含给定一条边的最小生成树。

\(n\leq 10^5,m\leq 2\times10^5\)




题解

直接先加入这条边,然后跑 Kruskal 算法即可。

正确性显然。

时间复杂度为 \(O(m\log m+n\alpha(n))\)


代码


Problem D zeal



题面

给定长度为 $n$ 的序列 $a$,$m$ 次求 $[l,r]$ 中出现 $k$ 次的元素数量。

\(n,m,a_i\leq 4\times 10^4\)




题解

直接上莫队算法即可。

时间复杂度 \(O(n\sqrt m)\)


代码


Problem E Alice 大战 Bob



题面

给定一个长度为 $n$ 的序列,有 $m$ 次询问。

每次询问给定 \(l,r\),Alice 和 Bob 依次操作,每次操作可以将 \(l\)\(1\) 或者 \(r\)\(1\)。操作后 \([l,r]\) 内的数若单调不升或单调不降,操作者获胜。

\(n,m\leq 10^6\)




题解

做法和 AGC002E 十分类似。

先把所有已经单调不升或单调不降的区域求出。

然后把一步能走到这些区域的位置求出。

于是问题变成了 AGC002E,可以自行查阅该题题解。

时间复杂度为 \(O(n+m)\)\(O(n+m\log n)\)


代码


Problem F 这是一道大水题



题面

给定 $n$ 个操作,每个操作为将 $[l,r]$ 的数加 $k$。

\(m\) 次询问只执行 \(t\notin[l,r]\) 的操作后 \([1,n]\) 的和。

\(n,m\leq 10^6\)




题解

注意到执行的操作对答案的贡献都是 $(r-l+1)\times k$。

于是对所有操作记录其 \(l,r\) 和贡献,统计答案时统计所有 \(r\) 小于 \(t\)\(l\) 大于 \(t\) 的操作贡献和即可,这个可以通过线段树简单实现。

时间复杂度 \(O((n+m)\log n)\)


代码


Problem G List it all



题面

给定 $n$ 个 $1\sim 9$ 的数字,问能组成的所有不同数的和,对 $10^9+7$ 取模。

\(n\leq 2\times 10^6\)




题解

所有数的和等于数的个数加上所有数的平均数。

数的个数和可以通过组合数公式简单计算,这里不再赘述。

对于平均数,不难发现每一位的数的平均值都等于给定的所有数的平均值,设每位平均值为 \(k\),总平均值即 \(11\cdots1\times k\)


代码


Problem H 智慧数



题面

定义一个数 $x$ 是好的,当且仅当存在一个正整数 $y|x$,使得 $x\neq y$ 且 $xy$ 为完全平方数。

求从小到大第 \(3000\) 个好数。




题解

对每个数暴力枚举因数检验即可。

记答案为 \(n\),存在 \(O(n^2),O(n\sqrt n),O(n\log n)\) 的解法。


代码


Problem I Imp



题面

给定一个长度为 $n$ 的 $01$ 串和 $m$。

你可以翻转单个字符,或同时翻转前 \(m\) 的倍数个字符,代价均为 \(1\)

问使得字符串前 \(n-m\) 个字符和后 \(n-m\) 个字符全部相等的最小代价。

\(n,m\leq 300\)




题解

比较有趣的一题。



  • Case 1

如果 \(2(n-m)\leq n\),即两段字符不交的情况中,由于整体翻转仅有一个操作,枚举是否执行这个操作后,对于每对字符判断是否需要翻转即可。

时间复杂度 \(O(n)\)



  • Case 2

考虑进行转化,记 \(f_i=[a_i=a_{i+m}]\),则对字符串的操作可以转化为对 \(f_i\) 的操作,目标为让 \(f_i\) 的。

注意到操作的特点,我们将 \(f_i\)\(m\) 个组成一行,共 \(\lceil\frac{n-m}{m}\rceil\) 行。

我们记行数为 \(N\),列数为 \(M\)

操作可以转化成每行和每列的操作,即翻转每行,翻转每列最上面和最下面的一格,翻转每列连续的两格。

于是一个暴力产生了:枚举每行是否翻转后对整个矩阵求答案,时间复杂度为 \(O(2^M\text{poly}(n))\)

然后我们发现我们还可以再写一个暴力:

假设我们已经把和前 \(i\) 行相关的所有操作做完了,第 \(i+1\) 行的状态为 \(S\) 的最小操作数为 \(f_{i,S}\),我们可以通过 dp 来求得答案,时间复杂度为 \(O(2^N\text{poly}(n))\)

因此,我们可以根号分治这两种情况,时间复杂度为 \(O(2^{\min(N,M)}\text{poly}(n))=O(2^{\sqrt n}\text{poly}(n))\),可以通过。


代码


Problem J 这是一道送分题

原题洛谷 P2466。


Problem K Chanllaging Problem



题面

咕咕咕



题解

咕咕咕



代码

咕咕咕


Problem L 这是一道压轴题



题面

给定一个 $01$ 串,问删除一个极长相同字符子串后能得到最长的极长相同字符子串。

\(|S|\leq 10^6\)




题解

显然得到的子串就是原来就有的串或者原来只隔一个极长相同字符子串的极长相同字符子串。

找到极长相同字符子串后枚举即可。

时间复杂度 \(O(|S|)\)


代码



推荐阅读
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
author-avatar
破背包
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有