CF1992场题解

Only Pluses

算法:数学。

题意简述:有三个数,每次选择一个数 \(x\),使得 \(x\) 增加一,至多操作 \(5\) 次,最后求出这三个数的乘积最大值。

简单题,一眼秒了。考虑把这 \(3\) 个数从小到大排序,显然加最小的数比加其他的数更优。

简单证一下:设排序后的三个数为 \(a,b,c\),有 \(b\times c\ge a\times b\)\(b\times c\ge a\times c\),而 \(b\times c\) 就是把最小数 \(a\) 加一增加的贡献,故改变最小数一定更优。

Angry Monk

算法:数学。

题意简述:有两种操作,把一个大于 \(1\) 的数 \(x\) 拆成 \(x-1\)\(1\);或者把 \(1\) 和另一个数 \(x\) 合并成 \(x+1\),问把原序列合成一个数最少需要几次操作。

简单题,同样一眼秒了。考虑最大的数不要拆,把剩下的数都拆成 \(a_i\)\(1\),最后把每个 \(1\) 和最大数 \(a_1\) 合并。

这里把一个数 \(x\) 拆开需要 \(x-1\) 次操作,合并需要 \(x\) 次操作,总共需要 \(x\times 2-1\) 次操作,所以我们应该按这个数排序,最大操作次数的不动。事实上,就是最大数不动。

Gorilla and Permutation

算法:贪心,构造。

题意简述:定义两个数组 \(f_i\)\(g_i\),构造出的数组为 \(a_i\),给定 \(m,k\)\(f_i\) 的转移:\(f_i=f_{i-1}+(a_i \ge k?a_i:0)\)\(g_i\) 的转移:\(g_i=g_{i-1}+(a_i \le m?a_i:0)\),最后求序列 \(a\) 使得 \(\displaystyle \sum_{i=1}^{n}(f_i-g_i)\) 取到最大值。

仔细想一想就可以发现,我们要让 \(f\) 尽可能大,\(g\) 尽可能小,所以根据 \(f\) 的定义,我们把当前最大的且能对 \(f\) 造成贡献的放在前面,剩下不能造成贡献的就从小到大放在上文提到那些数的后面,具体证明可以使用调整法,这里不再进行证明。

Test of Love

算法:贪心。

题意简述:有一个长为 \(n\) 的数组,初始在坐标为 \(0\) 的原木(原文中是岸边,但是两者等价,所以下文把岸边称为原木),要走到坐标 \(n+1\) 的原木上。数组中可能有原木,水,鳄鱼三个东西,鳄鱼所在位置不能到达,水的位置的到达次数不能超过 \(k\),每次在原木上可以向后跳跃 \([1,m]\) 格,在水上只能向后移动 \(1\) 格,问能不能到达 \(n+1\) 位置上的原木。

考虑贪心,如果当前在原木上,所在位置能向后到达一个原木,那我们选择最远的原木到达;否则,选择最远的水到达。如果在水上,直接向后即可。在每次出发前判断一下是不是处在鳄鱼格或者经过的水的数量超过限制即可。

每次选择最远的东西过去正确性显然,而优先选择原木是因为,原木一定能比水优,原因是原木可以向后很多,最右边的位置一定比现在最右边的位置远,而水只能向后 \(1\) 格,故原木一定更优。

Novice's Mistake

算法:数学。

题意简述:给出一个数字 \(n\),记 \(s\) 为把 \(n\) 转换为字符串后再把自己重复写 \(a\) 次后删掉最后 \(b\) 个字符(长度不足则删空,数字表示为 \(0\))所表示的数。求出有多少对 \((a,b)\) 满足 \(a\times n-b=s\)。例如字符串 923 表示数 \(923\)

我们发现 \(n\) 非常小,不超过 \(100\),而 \(a,b\) 也不超过 \(10^4\),故最后的 \(s\) 不超过 \(10^6\)

这里设 \(len\) 为字符串表示下的 \(n\) 的长度。

所以我们枚举 \(a\) 和最后字符串的长度 \(c\),这里简单推一下可以发现 \(b=a\times len-c\)。然后进行判断,看这样一组 \((a,b)\) 是否满足题意,如果满足加进我们的答案序列中即可。

Valuable Cards

算法:数据结构,数学。

题意简述:给一个序列,序列中没有数 \(x\),现在要求把序列划分成任意成连续段,使得每一段中不存在若干个数相乘的结果为 \(x\)。问最少划分成多少段。

我们考虑使用 set 维护当前如果出现值 \(k\),使得如果后续出现一个数 \(k\) 就能凑出来 \(x\)

具体维护方式为:我们判断每一个数 \(k\) 是否为 \(x\) 的因数,如果不是跳过即可。否则我们把 \(\dfrac{x}{k}\) 存进去,如果发现出现重复,则把 set 清空,再进行上述操作。而当遇到集合中的数 \(y\) 也是 \(k\) 的倍数时,把 \(\dfrac{y}{k}\) 也存进集合即可。

Ultra-Meow

算法:数学。

题意简述:定义 \(\operatorname {MEX}(S,k)\) 为集合 \(S\) 中没有出现的正数中第 \(k\) 小的,\(|S|\) 为集合 \(S\) 的大小。现在需要求出 \(\displaystyle \sum_{a\in S} \operatorname{MEX}(a,|a|+1)\)

一道比较正常的组合题,首先简单的想一下,可以看出可能产生的答案一定 \(\in [2,n\times 2+1]\),于是我们把它们分成两段计算。

第一段是答案 \(\in [2,n]\),我们考虑先枚举答案 \(i\),再枚举子集大小 \(j\),比较显然地,可以看出答案为 \(i\times C_{i-1}^{i-j-1}\times C_{n-i}^{j\times 2-i+1}\)。注意这里 \(j\) 的上界为 \(\min(i-1,\dfrac{n-1}{2})\),因为如果超过 \(i-1\) 个数,即使这些数都比 \(i\) 大,答案也至少是 \(i+1\);同理可得,如果超过 \(\dfrac{n-1}{2}\),也是不合法的。

上面的 \(i-j-1\) 其实是因为 \(i-j-1+j+1=i\),所以我们要让前面选这么多数,而剩下的数显然不能选 \(i\),故应该在 \([i+1,n]\) 这个区间中选择剩下的数。

第二段答案显然只有答案 \(i\) 为奇数才能产生贡献,而每一部分的贡献随意取 \(\dfrac{i}{2}\) 个即可,故贡献为 \(i\times C_{n}^{\dfrac{i}{2}}\)

所以我们预处理组合数,分开计算这两段答案即可。

代码

posted @ 2024-07-12 10:47  zxh923  阅读(35)  评论(0编辑  收藏  举报