欢迎光临散文网 会员登陆 & 注册

华泰证券FINTECH编程挑战赛 初赛+决赛 个人题解

2022-07-04 12:49 作者:俊杰_Charles  | 我要投稿

比赛链接:https://competition.nowcoder.com/3/introduce

受 qcjj 邀请打了个抢钱比赛,结果只抢了 500,太菜了,哭死

初赛

1 小华拼单词

题意:分别给出字母 a 到 z 的个数,求最多能拼出多少个 'huatai'

题解:字母 a 数量的一半,以及字母 i、u、h、t 的数量,取最小值

2 股票买卖的最大收益

题意:给定股票每天的价格,初始持有 x 手股票,现金 0 元。每天可以任意次买入或卖出,但最多持有 k 手股票。求最后一天结束的时候,最终总资产最多为多少。最终总资产=现金数+持有股票数×最终股票价格。

题解:贪心,如果下一天股票要跌就在当天全部卖出,如果下一天股票要涨就在当天全部买入。

3 运货

题意:给一棵 n 个节点的树,一共有 C_n%5E2 条路径,每条路径的愉悦值为路径上的最大结点编号,求所有路径愉悦值的和,对 10%5E9%2B7 取模。

题解:从小到大添加结点,用并查集维护连通块大小。当添加了一个点时,令它所连接的连通块个数为 k,各个连通块大小分别为 s_1%2Cs_2%2C%5Cdots%2Cs_k,那么以该点作为路径上最大点的路径个数为 %5Csum_%7Bi%3D1%7D%5Eks_i%2B%5Csum_%7Bi%3D2%7D%5Ek%5Csum_%7Bj%3D1%7D%5E%7Bi-1%7Ds_is_j,对序列 s 求前缀和后该式可以 O(k) 求出,总复杂度 O(n)

4 区间乘积的因子数之和

题意:给定一个数组,数组中每个数都是不大于 3 的正整数。已知一个区间的权值为该区间所有数乘积的因子数量,求所有区间的权值之和。

题解:由题意得一个区间所有数的乘积可以表示为 2%5Ex3%5Ey,它的因子个数为 (x%2B1)(y%2B1)。令 S%5E%7B(2)%7D_i 表示前 i 个数中 2 的个数,S%5E%7B(3)%7D_i 表示前 i 个数中 3 的个数,那么所有区间的权值之和可以表示为:

%5Cbegin%7Balign%7D%0A%26%20%5Csum_%7Br%3D1%7D%5En%5Csum_%7Bl%3D1%7D%5E%7Br%7D(S_r%5E%7B(2)%7D-S_%7Bl-1%7D%5E%7B(2)%7D%2B1)(S_r%5E%7B(3)%7D-S_%7Bl-1%7D%5E%7B(3)%7D%2B1)%20%5C%5C%0A%3D%20%26%20%5Csum_%7Br%3D1%7D%5En%5Csum_%7Bl%3D1%7D%5E%7Br%7D(S_r%5E%7B(2)%7DS_r%5E%7B(3)%7D-S_%7Bl-1%7D%5E%7B(2)%7DS_r%5E%7B(3)%7D%2BS_r%5E%7B(3)%7D-S_r%5E%7B(2)%7DS_%7Bl-1%7D%5E%7B(3)%7D%2BS_%7Bl-1%7D%5E%7B(2)%7DS_%7Bl-1%7D%5E%7B(3)%7D-S_%7Bl-1%7D%5E%7B(3)%7D%2BS_r%5E%7B(2)%7D-S_%7Bl-1%7D%5E%7B(2)%7D%2B1)%5C%5C%0A%3D%20%26%20%5Csum_%7Br%3D1%7D%5En%5Br(S_r%5E%7B(2)%7DS_r%5E%7B(3)%7D%2BS_r%5E%7B(2)%7D%2BS_r%5E%7B(3)%7D%2B1)-(1%2BS_r%5E%7B(3)%7D)%5Csum_%7Bl%3D1%7D%5E%7Br%7DS_%7Bl-1%7D%5E%7B(2)%7D-(1%2BS_r%5E%7B(2)%7D)%5Csum_%7Bl%3D1%7D%5E%7Br%7DS_%7Bl-1%7D%5E%7B(3)%7D%2B%5Csum_%7Bl%3D1%7D%5E%7Br%7DS_%7Bl-1%7D%5E%7B(2)%7DS_%7Bl-1%7D%5E%7B(3)%7D%5D%0A%5Cend%7Balign%7D

对序列 S%5E%7B(2)%7DS%5E%7B(3)%7D 以及两者的逐元素乘积求前缀和后,该式可以 O(n) 求出。

决赛

1 股票最小的陡峭值

题意:给定一个序列 a_1%2Ca_2%2C%5Cdots%2Ca_n,其中某些元素值是未知的,保证第一个和最后一个是已知的,求 %5Csum_%7Bi%3D2%7D%5En%7Ca_%7Bi-1%7D-a_%7Bi%7D%7C 的最小值。

题解:容易想到未知的值只要落在两侧已知的值之间即可保证结果最小,为方便代码,将未知的值直接替换为前一个元素的值即可。

2 小华的字符串后继

题意:给定一个小写字母字符串,求与该串长度相同且字典序大于该串的字符串中字典序第 k 小的字符串,若不存在输出 -1。

题解:把字符串看作 26 进制数,把 k 也转化为 26 进制数,作高精加法即可。

3 小华的排列交换

题意:给定一个排列,每次可以交换一个奇数和偶数的位置,求最少多少次交换能使得排列变得有序。

题解:每个位置看作一个结点,将该结点和该位置上的数的对应结点连一条单向边,可以得到若干环,称作置换环。通过推断可以得到如下结论:

  • 如果一个长度为 k 的置换环上既有奇数又有偶数,那么通过 k-1 次交换即可将环上的所有数归位。

  • 对于一个长度为 k_1 的只有奇数的环,和一个长度为 k_2 的只有偶数的环,可以先通过一次交换将两环合并成一个既有奇数又有偶数的环,然后再通过 k_1%2Bk_2-1 次交换将所有数归位,总次数为 k_1%2Bk_2

  • 对于一个长度为 k 的只有奇数/偶数的环,且没有偶数/奇数环与之合并,那么必须先通过一次交换将一个偶数/奇数加入该环,然后通过 k 次交换将所有数归位,总次数为 k%2B1

4 区间权值和

题意:定义一个数组的极差为该数组最大值减去最小值的差,定义一个区间的权值为该区间内所有连续子数组的极差之和,求给定数组的所有区间的权值和。

题解:最大值与最小值的贡献分开计算。对于每个数,可以通过单调栈分别找到左右两测比它大/小且距离其最近的位置,借此可以确定该数作为最大/最小值时的最长区间。令一个数的位置为 i,其左边比它大的距离最近的位置为 l,其右边比它大的距离最近的位置为 r,计算得该数作为最大值时的总次数为:

(%5Cunderline%7Bl%2B1%7D%2B%5Cunderline%7Bl%2B2%7D%2B%5Cdots%2B%5Cunderline%7Bi-1%7D%2B%5Cunderline%7Bi%7D)(%5Cunderline%7Bn-r%2B2%7D%2B%5Cunderline%7Bn-r%2B3%7D%2B%5Cdots%2B%5Cunderline%7Bn-i%7D%2B%5Cunderline%7Bn-i%2B1%7D)

可通过等差数列求和公式或维护前缀和算出,最小值同理,最终将最大值的总贡献减去最小值的总贡献即是所求答案,总复杂度 O(n)

5 排队

平衡树,不让用板子,润。

6 项链

群论,不会,润。

算法竞赛交流群:1043272289


华泰证券FINTECH编程挑战赛 初赛+决赛 个人题解的评论 (共 条)

分享到微博请遵守国家法律