| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> Codeforces Round #739 (Div. 3) 题解 完整A~F -> 正文阅读 |
|
[数据结构与算法]Codeforces Round #739 (Div. 3) 题解 完整A~F |
Codeforces Round #739 (Div. 3) 题解A. Dislike of Threes题意求所有不能被 3 3 3整除且个位不为 3 3 3的正整数中,第 k k k大的是多少。(关注数据范围, 1 ≤ k ≤ 1000 1\le k\le 1000 1≤k≤1000) 思路题目限定 k ≤ 1000 k\le1000 k≤1000,那么不妨直接预处理打表,样例里面有第 1000 1000 1000个符合题意的数是 1666 1666 1666,那么只需处理至 1666 1666 1666即可。本题使用纯暴力,每次都求一遍也可以通过。 时间复杂度预 处 理 O ( n ) , 求 值 O ( 1 ) 预处理O(n),求值O(1) 预处理O(n),求值O(1) AC代码
B. Who’s Opposite?题意给定一个由偶数个点组成的环,点在环上均匀分布,按顺时针依次从 1 1 1开始编号。完成编号后,每个点关于圆心对称处必定存在另一个点,例如: 6 6 6个点组成的环中, 1 1 1与 4 4 4相对, 2 2 2与 5 5 5相对, 3 3 3与 6 6 6相对。现给定 3 3 3个互不相同的正整数 a , b , c a,b,c a,b,c,并已知编号为 a a a的点与编号为 b b b的点相对,问与 c c c相对的点编号是多少,如果这样的环不存在,输出 ? 1 -1 ?1。 思路给出了 a a a和 b b b,我们就可以求出这个环上有多少个点,记环上有 2 n 2n 2n个点,那么就有 n = ∣ a ? b ∣ n=|a-b| n=∣a?b∣。于是就有了 3 3 3个限制条件,也就是: a , b , c a,b,c a,b,c都必须在环上,换句话说, 1 ≤ a , b , c ≤ n 1\le a,b,c\le n 1≤a,b,c≤n。若条件满足,则能够求出 c c c对面的点,其编号是 c + n c+n c+n和 c ? n c-n c?n中符合条件的一个。细致来说, c ≤ n c\le n c≤n时为 c + n c+n c+n, c > n c>n c>n时为 c ? n c-n c?n。 时间复杂度O ( 1 ) O(1) O(1) AC代码
C. Infinity Table题意现有一个无限大的空表格,在 ( 1 , 1 ) (1,1) (1,1)位置填入 1 1 1,然后按照以下规则填表:
1 2 5 10 4 3 6 ? ? 9 8 7 ? ? \begin{matrix}{} 1 & 2 & 5 & 10\\ 4 & 3 & 6 & \ \vdots\\ 9 & 8 & 7 & \ \vdots \end{matrix} 149?238?567?10????? 问:正整数 k k k在这个表格中,位于什么位置,用行号和列号表示。 思路观察表格,不难发现填入 ( 1 , 2 ) → ( 2 , 2 ) → ( 2 , 1 ) (1,2)\to(2,2)\to(2,1) (1,2)→(2,2)→(2,1)区域的数,值域为 ( 1 2 , 2 2 ] (1^2,2^2] (12,22],填入 ( 1 , 3 ) → ( 3 , 3 ) → ( 3 , 1 ) (1,3)\to(3,3)\to(3,1) (1,3)→(3,3)→(3,1)区域的数,值域为 ( 2 2 , 3 2 ] (2^2,3^2] (22,32],进一步推广可以发现,填入 ( 1 , n ) → ( n , n ) → ( n , 1 ) (1,n)\to(n,n)\to(n,1) (1,n)→(n,n)→(n,1)区域的数,值域为 ( ( n ? 1 ) 2 , n 2 ] ((n-1)^2,n^2] ((n?1)2,n2],且前 n n n个数按列从上到下排布,后 n ? 1 n-1 n?1个数按行从右到左排布。然后只需将 k k k减去 ( n ? 1 ) 2 (n-1)^2 (n?1)2,按上述规则简单求值即可。 时间复杂度O ( 1 ) O(1) O(1) AC代码
D. Make a Power of Two题意给定一个正整数 n n n,每次在十进制下可以去掉该数的某一位(若去掉某一位后,导致该数有前导0,则前导0不消失),或者在数的末尾增加一位任意数字。求至少多少次操作后,该数变为 2 2 2的整数次幂。 思路关注
n
n
n的数据范围,
n
n
n不超过
1
0
9
10^9
109,那么也就是说,最多
9
9
9次操作后,我们一定能得到一个
2
2
2的整数次幂:去掉这个数的所有位(最多操作
8
8
8次),在末尾增加一个
1
1
1。因此,最终的结果,一定不超过
1
0
18
10^{18}
1018(也就是不断在末尾添加数,加
9
9
9次)。众所周知, 对于每一种可能的结果,采用双指针匹配来求出需要多少次操作。我们记 x x x为目标的数, y y y为给定的数,记 x i x_i xi?为 x x x的第 i i i位, y j y_j yj?为 y y y的第 j j j位,根据贪心思想,如果当前匹配至 x i x_i xi?和 y j y_j yj?位置,若 x i = y j x_i=y_j xi?=yj?,则将这两个位置匹配, i , j i,j i,j指针同时后移,否则 i i i指针不动, j j j指针后移,由于这一位没能匹配上,原先 j j j位置的数需要删除,操作数需要加 1 1 1。全部匹配完后,多余的部分也需要加入到操作数中,也即为 x x x补全缺失的数位,为 y y y删去多余的数位。 由于要将整数按十进制位拆分,常用的方法是将整数转化为字符串, 时间复杂度O ( 62 ) ( 具 体 复 杂 度 不 好 算 , 但 肯 定 很 快 , 是 常 数 级 的 复 杂 度 ) O(62)(具体复杂度不好算,但肯定很快,是常数级的复杂度) O(62)(具体复杂度不好算,但肯定很快,是常数级的复杂度) AC代码
E. Polycarp and String Transformation题意现有字符串 t t t和 s s s,其中 t t t初始为空串, s s s初始非空,并按以下规则进行操作:
以上操作必须按顺序执行,并不断重复操作,直到 s s s变为空串。 现给定完成了所有操作后的字符串 t t t,求原先的字符串 s s s,并求出字母的删除顺序。 如果不存在相应的答案,输出 ? 1 -1 ?1。 思路
首先,我们假定我们知道 s s s的内容,设 s s s中一共有 k k k个不同的字母,并设删除顺序为 d 1 , d 2 , … , d k d_1,d_2,\dots,d_k d1?,d2?,…,dk?,这些字母分别出现了 c 1 , c 2 , … , c k c_1,c_2,\dots,c_k c1?,c2?,…,ck?次,那么在字符串 t t t中, d 1 d_1 d1?出现了 1 × c 1 1\times c_1 1×c1?次, d 2 d_2 d2?出现了 2 × c 2 2\times c_2 2×c2?次, d k d_k dk?出现了 k × c k k\times c_k k×ck?次~~(我觉得这应该比较容易理解,不需要证明了)~~。 利用上述性质,我们根据得到的 t t t,从后往前逆推答案。最后一个出现的字母,一定是 d k d_k dk?(这毫无疑问),除去 d k d_k dk?之外,最后一个出现的字母是 d k ? 1 d_{k-1} dk?1?。于是,字母的删除顺序就可以求出来了。根据上一段中说明的,每个字母在 t t t中出现次数的结论,我们在统计了 i × c i i\times c_i i×ci?之后,很容易可以求出 c i c_i ci?。如果 d i d_i di?在 t t t中的出现次数不能被 i i i整除,那么显然答案不存在,输出 ? 1 -1 ?1即可。 由于 t t t中,最开始时一定会加入一段完整的 s s s,那么我们对前若干个字母进行统计,直到各字母的出现次数与预期的 c i c_i ci?相等。这里不建议每次都将 26 26 26个字母的出现次数一一比较,这样效率太低。假定答案存在,那么 s s s的长度就等于 ∑ c i \sum c_i ∑ci?。如果在这一段中,各字母的出现次数与预期不符,则答案不存在。 最后,还需要进行最后一次确认。现在我们已经得到了 s s s和 d i d_i di?,我们只需要根据操作规则,完整模拟字符串 t t t的生成过程,将生成的字符串与给定的比较,如果完全一致,则可以输出答案了,否则答案不存在。
时间复杂度O ( n ) ( n 是 字 符 串 t 的 长 度 ) O(n)(n是字符串t的长度) O(n)(n是字符串t的长度) AC代码
F1/F2. Nearest Beautiful Number
题意定义一个正整数为k-beautiful:该正整数中出现过的不同数字的数量不超过 k k k。 给定正整数 n n n和 k k k,求不小于 n n n的最小k-beautiful数。
思路这其实是一个暴力搜索+分类讨论+剪枝的题目。我们对一个数按十进制位展开,一位一位的分析。
设状态 ( p , k , n , f ) (p,k,n,f) (p,k,n,f):
接下来是状态的转移以及剪枝:(式中 d i d_i di?表示给定的数的第 i i i位,下标从 0 0 0开始)
以上的 a n s w e r answer answer需初始化为无穷大,经过更新后,最终求得的 a n s w e r answer answer就是答案了。状态转移只有这 3 3 3种方式,其他方式要么不合法,要么不够优秀。 虽然看起来每一个位置都有 3 3 3类情况,复杂度是指数级别,但实际上有两种情况都会转移到 f = 1 f=1 f=1的情形中去,并立刻被剪枝,因此实际上的复杂度是线性的,甚至由于一个数的位数极其有限,算法的复杂度甚至可以认为是常数级复杂度。 时间复杂度O ( n ) ( n 极 小 ) O(n)(n极小) O(n)(n极小) AC代码
后记这一场真的好多暴力,模拟,分类讨论之类的,没有真的涉及到太多算法,但赛时F题分类讨论没讨论清楚,AK失败,气死我了。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:19:16- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |