首页 > 其他分享 >CF div1+2 999 (A~E)

CF div1+2 999 (A~E)

时间:2025-01-21 11:21:19浏览次数:1  
标签:code 999 CF 差值 div1 拆分 操作 dp 贪心

赛时三题,\(D\)就差一个显然的剪枝就能过了,qwq...

A

显然第一步能选偶数就选偶数,之后只能选奇数。细节见代码。

code

B

对于选取的任意四条边,设腰为\(x\),短边为\(a\),长边为\(b\),则能形成等腰梯形的充要条件为:\(x\)出现次数\(>=2\),且\(a+2*x>b\)。两个腰选最大,并且\(a,b\)尽可能接近显然更优。具体实现见代码。

code

C

刚开这题时以为是一个神奇妙妙题,硬想了四十多分钟。等意识到是\(dp\)时,不到十分钟就码完了,只能说自己太唐了。。。

状态定义:\(dp[i][0/1]\):表示考虑前\(i\)个人,且第\(i\)个人是诚实者(\(1\))\(or\)说谎者(\(0\))的方案数。

\(init\):第一个人是诚实者的充要条件为\(a[1]==0\),是说谎者的充要条件为\(a[2]==1\)(证明略)

\(ans = dp[n][0] + dp[n][1]\)

\(trans:\)根据题目规定的条件,对每一步转移的合法性做相应判断,来决定是否转移即可,细节见代码。

code

D

逆向思考,\(b\)中每个数的拆分是唯一的。所以直接对\(b\)中的每个数尝试拆分。可以证明按任意顺序拆\(b\)数组中的数都是可行的,只要拆分过程中能与\(a\)中的某个数匹配则直接匹配,最后看是否能全部匹配即可。

注意,操作数最多为\(n-m\)(本题赛时的败笔。太显然了,不知道赛时为啥忘了这一点。。)所以直接记录拆分次数,\(>n-m\)时直接判不可行即可。同时,若拆分出的某个数没有在\(a\)中出现,且不能继续拆分(即为\(1\)),则也直接判不可行即可。

code

E

不难的一道题。

对某一个数的操作次数最多为\(m\)次,因为没有必要与相同的数,且最多能 \(and\) \(m\)个数。

故可以设一个数组\(w[i][j]:\)对\(a[i]\)操作\(j\)次,可以减少的最大差值。

该数组可以用\(O(n 2^{m})\)的复杂度预处理出来,具体实现见代码。

再考虑\(k\)次操作:显然,每一次贪心地选择一个能最大化差值的方案总是最优的,而\(k\)是\(O(nm)\)级别,故可以考虑模拟操作过程,每次贪心地选取最优方案。

暴力模拟的复杂度是\(O(nmk)\),考虑优化:

需要注意到一个关键性质:对于固定的\(i\),\(w[i][]\)的差分数组是递减的,即对于任意\(j1 < j2\):

\[w[i][j1] - w[i][j1 - 1] > w[i][j2] - w[i][j2 - 1] \]

因为减少\(a[i]\)的方式是做与运算,故每次操作时,一定是贪心地选取能减少当前\(a[i]\)的最高二进制位为\(1\)的那个\(b[i]\),那么显然后续的操作,\(a[i]\)减少的值就一定不会比这一次操作多。也就是说随着操作进行,\(a[i]\)减少的值是递减的,故上式成立。

所以可以用一个大根堆来维护对于每个\(a[i]\)做当前操作会减少的差值,每次做完操作后把对\(a[i]\)做下一次操作会减少的差值放进堆中。这样可以保证每次堆顶都是最优操作(因为堆维护的都是当前操作,后续的操作 由上述证明可知 减少的差值都比当前操作要少,所以可以这样贪心,否则得用背包\(dp\)),模拟\(k\)次即可。复杂度为\(O(n 2^{m} + klogn)\)

code

标签:code,999,CF,差值,div1,拆分,操作,dp,贪心
From: https://www.cnblogs.com/jjjxs/p/18682829

相关文章

  • vp - CF1899
    (逆天罚时局)复盘看A,一眼简单题。如果先手拿到的就是\(3\)的倍数,则后手必胜,否则先手可以只走一步达成\(3\)的倍数(最开始我还想反了,导致00:05)。不想开B,看C,我相信它有更简单的解法但我dp也能过。B马上切了没什么好说的。D直接分析一句话题意,然后用函数胡一下,发现整......
  • CF div3 998(F,G)
    F\(dp\)+组合数学需要注意,数组中\(>1\)的数字个数不会超过\(log_{2}k\)个。先暂时不考虑\(1\)的摆放,只考虑所有\(>1\)的数:设\(f_{l,i}:\)长度为\(l\),乘积为\(i\),且所有元素均\(>1\)的数组个数考虑数组的最后一个元素\(d\),必有\(d|i\)成立,因为每个元素一定是\(i\)的因子。则......
  • CF1253F Cheap Robot
    CheapRobot题目翻译:给一个带$N$个点的带权无向连通图,并给定$k$每经过一个边就要消耗边的边权$w$,而当到达$1\simk$的节点处可以将点充满。求从$a$到$b$所需要的最小点容量$c$。及一次性消耗的电量不能超过$c$。前置知识:$1.$最近公共祖先$LCA$$2.$最小生成树$kruskal$$3.$......
  • 题解:CF580B Kefa and Company
    CF580BKefaandCompany前言。其实本题与这道题极为相似,所以建议降橙。思路因为输入顺序不影响就结果,所以可以先给\(a\)按照工资从小到打排序一下序(这里\(a\)使用MAP)。然后再使用尺取法,只要\(a_{r+1}\)的值减\(a_l\)的值\(\ltk\)就将\(r\)加\(1\)。然后发现每......
  • CF 265B.Roadside Trees (Simplified Edition)(Java实现)
    题目分析    松鼠的起点在第一棵树的0位置,它的行动轨迹为到达顶端,吃坚果,到另一棵树的同位置,到达顶端,吃坚果。思路分析    根据题目分析,我们需要有一个不断更新的起始位置,单次循环内的时间=到达顶端的距离+吃坚果+跳跃=顶端-起始+1+1代码        ......
  • CF 284B.Cows and Poker Game(Java实现)
    题目分析    奶牛也打扑克。一共有三种情况,简称AFI,并且只有自己为AI状态其余全部人为AF状态才可以亮手牌。思路分析    根据题目分析,针对三个不同状态分析情况:当且仅当有一个I时,唯有这个奶牛可以亮牌,如果I的个数大于1,一个也不能亮牌;当没有I时,判断A的个数,有......
  • 「CF 123E」Maze
    传送门题意澄清对于dfs遍历时,在某一个点进入子树的顺序并不是按输入顺序,而是假定随机选择未进入过的子树(这纠结了我好久)。破题思路首先可以明确这题不能推一个\(O(1)\)的式子来计算期望(树的结构是随机的,对于所有点不存在均摊期望的可能),但是对于某一刻子树以根节点......
  • CF516E Drazil and His Happy Friends 做题记录
    CF516EDrazilandHisHappyFriendsDescription有\(n\)个男生\(m\)个女生,编号分别为\(0\simn-1\)和\(0\simm-1\)。有\(B\)个男生和\(G\)个女生是快乐的,其他人是不快乐的。在第\(i\)天,编号为\(i\bmodn\)的男生和编号为\(i\bmodm\)的女生会一起......
  • 题解:CF140A New Year Table
    CF140ANewYearTable思路注意到题目中提到了大圆与小圆相切,我们可以计算由两条经过小圆周长与大圆圆心的切线组成的圆心角的度数。但是这个角度其实不好算,所以我们可以求出它一半的正弦值,也就是\(b\div(a-b)\),然后用asin函数求出其度数(以弧度为单位)。最后答案就是判断\(......
  • [CF2048F] Kevin and Math Class 题解
    注意到这里有个区间的\(b_i\)最小。我们考虑每个\(b_i\)作为最小的时候各操作几次。显然每个\(b_i\)的【操作区间】更长是不劣的。于是这些个\(b_i\)是可以打成笛卡尔树,进行DP。想到这一点,DP便是不难的了。定义\(f_{i,j}\)为以\(i\)为根的子树内,最优操作后最大值......