2018/3/25训练日记 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛

昨天的比赛题解

第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛

psd 面试 

| 因为忽略大小写,先将所有大写字母转成小写 (或反过来), | 然后就是求该字符串的最长回文子序列的长 度, | 最后用总长度去减。

求最长回文子序列长,可以考虑两种做法:
1. 将原串复制一份并翻转,让后原串与反串做 LCS
2. 直接 DP
- 定义:dp[i][j] 为原串从第 i 个字符到第 j 个 字符这个子串的最长回文子序列长
- 转移: * 当 s[i] != s[j] : dp[i][j] = max { dp[i][j-1], dp[i+1][j]} * 当 s[i] == s[j]:dp[i][j] = max { dp[i][j-1], dp[i+1][j],dp[i+1][j-1]+2}

- 初始化:dp[i][i]=1,其它为 0

密码

 比较直接的方法可以直接模拟存储到二维数 组中,然后再输出。也可以通过观察,发现第一 行和最后一行相邻两个字符相隔 2*n-2,而中间 的行交替相隔 2*(n-i-1) ,2*i(i 为第 i 行) , 然后就可以直接输出答案。

跳台阶 

因为每一步只能往前跳,而且可以任意跳,所 以,可以由第 0,1,..n-1 级跳到第 n 级台阶很 容易就可以推出第 n 级台阶的方案数,就是前 0~n-1 级台阶方案数的总和。第 0 级是 1,第 1 级也是 1,第 2 级是 2,第 3 级是 4, 。 。。因此第 n(n>0)级台阶就是 2 的(n-1)次方。

旋转矩阵 

可以定义右旋为+1,左旋为+3,最终结果对 4 取模就知道旋转结果。右旋 2 次、左旋 1 次可以 当做右旋 2、3 次处理,所以只要写出矩阵右旋 操作的函数就可以了。矩阵右旋坐标转换公式: a[i][j]=b[j][n-1-i],a 是原矩阵,b 是右旋的矩阵, n 是总行数,m 是总列数(a[n][m])。注意“-” 和“|”也要变形。

回旋星空 

题意就是给你若干个点,问你存在几组点,满 足题目的条件 d(a[i],a[j])==d(a[j],a[k]) 那你可以枚举转折点,然后在用这个转折点去扫 其他的点,求这个转折点与其他点的距离,存起 来,判断每个距离 的出现次数是否大于等于 2,如果大于就算一下 排列数(正反算不同的)加到 ans 上。

强迫症的序列 

根据题意,由于每次操作,都给 n-1 个元素都加 1,所以为了使得所有的序列都达到一样的值, 要想操作步数最小, 那么你每步操作都一定要对最小值加一,那么有 这样的前提下,你可以做出如下推论 step: 总操作步数 ans:最终序列的元素 min:序列里的最小值 n:序列长度 可以看出,最终的值等于最小值加上操作步数: ans=min+step 终态序列的求和与初始序列的求和有如下关系: n ∗ ans − ∑ai=step ∗ (n − 1) 联立求解得 n ∗ min+n ∗ step − ∑ai=step ∗ (n − 1) n ∗ min+n ∗ step − ∑ai=n ∗ step − n step= ∑ai − n ∗ min step= ∑(ai − min) 为什么每步一定要给最小值加一(瞎证) 假设给最小值操作了步,有 step2 步没有操作最 小值

step: 总操作步数 step1: 含最小值的操作数 step2: 不含最小值的操作数 ans:最终序列的元素 min:序列里的最小值 n:序列长度 step=step1+step2 因为加 step1 次,就不操作 min,说明他达到了 最终状态,所以 ans 值有下列关系 ans=mi+step1 n ∗ ans − ∑ai=step ∗ (n − 1) ∗ + ∗ − ∑ =(+) ∗ ( − 1) n ∗ min + n ∗ step1 − ∑ai = (step1 + step2) ∗ (n − 1) step1 − (n − 1) ∗ step2= ∑(ai − min) 上面的等式,右边大于零,所以右边也要大于零 step1>(n − 1) ∗ step2 这样你就会发现 step2 的操作其实是多余的,大 致就是这样吧


平分游戏 

把会相互影响的同学先放在一起,就会形成很多 个环,环与环之间是没有影响的,我们可以单独 处理每个环的答案加起来就可以了。 例 如 有 一 个 环 , 上 面 的 人 的 硬 币 数 是 c[1],c[2].....c[num],这 num 个人按顺序形成了一 个环,假设我们第一个人从最后一个人那里收到 了 x 个 硬 币 , 那 么 当 前 环 总 时 间 就 是 abs(x+c[1])+abs(x+c[1]+c[2])+abs(x+c[1]+c[2]+c[3]). ..... 设 b[1]=c[1],b[2]=c[1]+c[2],b[3]=c[1]+c[2]+c[3]..... 显 然这个可以算一下 b 数组的中位数就能得出最 佳的 x 是多少,最后把所有环的答案加起来就是 最终答案

注意要要判断一下每个环的平均数是不是整数 且相等 注意 k 可以等于 n,就意味着不能交换。


跳一跳,很简单的 

树顶多 26 种状态,问题就是如何判断两节点 字典序大小,若有两字符串的字符串 hash 数组, 那么可以用二分寻找第一个不同字母的位置复 杂度为 O(logn),那么可以先预处理出 26 棵树从 根节点到叶子节点的字符串 hash 值,对于快速 定位从某节点向上k步的位置可以用倍增法向上 寻找,复杂度为 O(logn),那么每次询问的复杂度 为 O((logn)^2)。总复杂度 O( 26*n + n*logn + Q*(logn)^2)。


用来作弊的药水

解法 1: 枚举几个素数进行取模快速幂求解
解法 2: 分解质因数然后判断每个质因数的数量是否 相等
解法 3: 取对数然后直接判断相等,判断误差至少为 1e-5


等式

1/x+1/y=1/n --> nx+ny=xy --> (n-x)*(n-y)=n*n 转化为求 n*n 小等于 n 的因子的个数,由于 n 达到 10^9,直接求太大。
将 n 分解质因子,复杂度为 logn,n*n 对应的 质因子和 n 相同,且个数翻倍,即可得到 n*n 的 质因子个数。


哲哲的疑惑

答案显然是下式(相当于枚举一个 i 表示我用了 i 种颜色)

∑n i=0(n i)∗{l i}∗i!∗f(n−i)= ∑n i=0(n i)∗f(n−i)∗∑i j=0(i j)∗(−1)i−j ∗jl= ∑n j=0 jl ∗(−1)j ∗∑n i=j (−1)i ∗(n i)∗(i j)∗f(n−i)= ∑n j=0 jl ∗(−1)j ∗(n j)∗∑n i=j (−1)i ∗(n−j i−j)∗f(n−i)= ∑n j=0 jl ∗(n j)∗∑n−j i=0 (−1)i ∗(n−j i )∗f(n−j −i)= ∑n j=0 jl ∗(n j)∗∑n−j i=0 (−1)n−j−i ∗(n−j i )∗f(i)设 f(i) = cm ∗(i m)+ cm−1 ∗( i m−1)+……+ c0 ∗(i 0)因为 ∑n−j i=0 (−1)n−j−i ∗(n−j i )∗f(i) 是把 f(i) 差分 k 次后的 f(0)所以原式 =∑n j=0 jl ∗(n j)∗cn−j然后我们这里 f(i) =(i m), 所以只有 cm = 1所以原式 =(n−m)l ∗(n m)bonus: 这题 n,m 可以出到 1e9



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值