• 【11.14】Codeforces 刷题


    DP \text{DP} DP


    B. Two Strings

    题意:

    考虑 s s s 的所有与 t t t 相同的子序列,询问是否 s s s 中每一个字母都属于这样的一个子序列中。长度 n , m ≤ 2 ⋅ 1 0 5 n,m\leq 2\cdot 10^5 n,m2105

    思路:计算 s s s 每个字符 s i s_i si ,预处理以该字符为起始 / 结束的最长匹配子序列长度。

    AC代码:https://codeforces.com/contest/223/submission/180593963


    D. Two out of Three

    题意:

    一队顾客排在一位收银员前面。他采取这样一个策略:每次,假如队伍有至少两人,就会从前面的前三人(如果有)中选取两位一起收银,所花费的时间为这两人单独收银所需时间的最大值。如果只有两人,那么一起收银;如果只有一人,那么单独收银。请问所需的总时间最少是多少?

    1 ≤ n ≤ 1000 , 1 ≤ a i ≤ 1 0 6 1\leq n\leq 1000,1\leq a_i\leq 10^6 1n1000,1ai106

    题解:CF82D Two out of Three 题解

    思路:容易知道,收银 i i i 次之后,对于前 2 ⋅ i + 1 2\cdot i+1 2i+1 个人,一定会剩下一个人。我们就以剩下这个人为标准进行集合分类。

    定义 d p ( i , j ) dp(i,j) dp(i,j) 表示收银 i i i 次且剩下的这个人编号为 j j j 的最少时间。转移方程:

    x = 2 ⋅ i , y = 2 ⋅ i + 1 x=2\cdot i,y=2\cdot i+1 x=2i,y=2i+1
    d p ( i , j ∈ [ 1 , 2 ⋅ i − 1 ] ) = d p ( i − 1 , j ) + max ⁡ ( a x , a y ) dp(i,j\in[1,2\cdot i-1])=dp(i-1,j)+\max(a_x,a_y) dp(i,j[1,2i1])=dp(i1,j)+max(ax,ay)
    d p ( i , x ) = max ⁡ { d p ( i − 1 , j ∈ [ 1 , 2 ⋅ i − 1 ] ) + max ⁡ ( a i , a y ) } dp(i,x)=\max \{dp(i-1,j\in[1,2\cdot i-1])+\max(a_i,a_y) \} dp(i,x)=max{dp(i1,j[1,2i1])+max(ai,ay)}
    d p ( i , y ) = max ⁡ { d p ( i − 1 , j ∈ [ 1 , 2 ⋅ i − 1 ] ) + max ⁡ ( a i , a x ) } dp(i,y)=\max \{dp(i-1,j\in[1,2\cdot i-1])+\max(a_i,a_x) \} dp(i,y)=max{dp(i1,j[1,2i1])+max(ai,ax)}

    AC代码:https://codeforces.com/contest/82/submission/180949721


    构造 ∗ 1700 ∼ ∗ 2000 ^*1700\sim ^*2000 17002000


    D. Walk on Matrix

    题意:

    有这么一个问题:

    有一个 n × m n \times m n×m 的矩阵 a n , m a_{n, m} an,m,矩阵的每个位置都有一个数,要求寻找一个每次只能向右或向下走的从 ( 1 , 1 ) (1, 1) (1,1) ( n , m ) (n, m) (n,m) 的路径,最大化路径上的数的按位与之和。

    1 ≤ n , m ≤ 500 1 \leq n, m \leq 500 1n,m500 0 ≤ a i , j ≤ 3 × 1 0 5 0 \leq a_{i, j} \leq 3 \times 10^5 0ai,j3×105

    现在给出解决该问题的一个错误 dp 算法(见题面图片),请构造一组数据,hack 掉这个算法,使得正确答案比错误的输出恰好 k k k

    0 ≤ k ≤ 1 0 5 0 \leq k \leq 10^5 0k105

    题解:CF1332D Walk on Matrix 题解

    思路:写这一题,需要想出来如何合理构造路径,骗过这个错误的算法。

    AC代码:https://codeforces.com/contest/1332/submission/180949691


    D. Task On The Board

    题意:

    给定一个字符串s,保证字符串内的字符在"a"到"z"范围内

    然后给一定一个整数 m 和一个长度为 m 的序列 b

    要求从s中取出 m 个字符构成一个新的字符串a(不可重复取相同位置的字符),任意排列后,是其满足对于每一个 i 都有 a[i] 到 a 中 所有比它大的(即字典序比它大,如 b > a,z > x )的字符在字符串 a 中的距离之和为 b[i]

    要求输出满足条件的字符串 a

    思路:主要思路是,从字典序最大的向最小的填,填的位置可以一个一个推出来。

    AC代码:https://codeforces.com/contest/1367/submission/180962175


    E. Maximum Subsequence Value

    题意:

    给出一个长度为 n ( 1 ≤ n ≤ 500 ) n(1\le n\le500) n(1n500) 的数列 a ( 1 ≤ a i ≤ 1 0 18 ) a(1\le a_i\le10^{18}) a(1ai1018),你需要选出一个子序列,使其价值最大,输出最大的价值。

    对于一个长度为 k k k 的子序列,若在这个子序列中有不少于 max ⁡ ( 1 , k − 2 ) \max(1,k-2) max(1,k2) 个数的二进制位 i i i 上是 1 1 1,则其价值增加 2 i 2^i 2i

    思路:诈骗题。不少于 max ⁡ ( 1 , k − 1 ) \max(1,k-1) max(1,k1) 在这一进制位上为 1 1 1 ,意味着最多有两个 0 0 0 。我们如果有一个序列,删除一个数,如果这一位上是 1 1 1 ,那么不影响 0 0 0 的个数;如果是 0 0 0 ,那么更有可能对答案有贡献。因此删数后答案一定不会更劣,枚举 k = 3 k=3 k=3 的序列。

    AC代码:https://codeforces.com/contest/1365/submission/181052652


    B. Orac and Medians

    题意:

    询问 a 1 , a 2 , ⋯ a n a_1,a_2,\cdots a_n a1,a2,an能否通过若干次将任意区间全部赋值为其中位数这个操作,来使得整个序列全部变为 k k k。(中位数指第 ⌊ ∣ s ∣ + 1 2 ⌋ \lfloor \frac {∣s∣+1} 2 \rfloor 2s+1小的数)
    多次询问,每次第一行两个整数, n n n k k k;第二行 n n n个整数, a 1 , a 2 , ⋯ a n a_1,a_2,\cdots a_n a1,a2,an
    数据范围: 1 ≤ n ≤ 1 0 5 , 1 ≤ k ≤ 1 0 9 , 1 ≤ a i ≤ 1 0 9 1 \le n \le 10^5,1 \le k \le 10^9,1 \le a_i \le 10^9 1n105,1k109,1ai109,并保证所有询问中 n n n的和不超过 1 0 5 10^5 105

    思路:这是一道推理题,需要思考出一些性质,从这些性质解决问题。详见 题解

    AC代码:https://codeforces.com/contest/1349/submission/180956072

  • 相关阅读:
    vue3.x+ts项目创建,配置流程
    【技术美术实践部分】Unity Shader纹理1.0-使用单张纹理
    【python】python内置函数——dir()获取对象的属性和方法
    grpc使用教程
    Vue项目引入腾讯地图,实现可以根据关键词搜出相关位置,并定位到该位置
    最新冠军方案开源 | MOTRv2:YOLOX与MOTR合力打造最强多目标跟踪!(旷视&上交)...
    深度学习与机器学习:互补共进,共绘人工智能宏伟蓝图
    Kubernetes(k8s)CNI(flannel)网络模型原理
    postgresql-视图
    Java---Map双列集合
  • 原文地址:https://blog.csdn.net/weixin_51948235/article/details/127859384