热门标签 | 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|)\)


代码



推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
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社区 版权所有