比赛地址:2023广师大训练赛2
A 头号单词
签到题。遍历字符串,判断即可。
C语言代码
C++代码
Java代码
Python代码
B 最大乘积
模拟题。由于位或运算的性质,两个数字“越或越大”,设z=x|y,则z>=x&&z>=y成立。
所以,把所有的数组元素都位或一遍,就可以得到单个元素的最大值,进而得到最大乘积。
请注意,一个最大值都有可能超过1000000007,需要提前取模,不然会爆long long 。
另外,还要用到取余法则。
(x*y)%mod=((x%mod)*(y%mod))%mod
C 分配方案
快速幂、组合数学。高中数学的结论,C(0,n)+C(1,n)+…+C(n,n)=2^n 。
结合题意,每个验题人至少要验一道题,所以转化为求n道题目的非空子集,即2^n – 1 。
用循环来实现幂运算,显然会超时,那么就需要使用 快速幂算法 。
C语言代码
C++代码
Java代码
Python代码
D 生日礼物
动态规划。比较经典的完全背包问题,对于i>2的情况下,区间 [1,i-1] 的所有答案,均为最优答案,那么只需枚举几百袋巧克力即可求出dp[i]的最优值。
为了避免超时,需要进行dp数组的预处理。
为了避免超内存,需要把空间复杂度压缩到1e5。
C语言代码
C++代码
Java代码
Python代码
E 纸牌游戏
博弈论。首先把所有纸牌按照下标的奇偶性进行分组,杰哥可以选择拿奇数堆或者拿偶数堆。
如果杰哥拿的是奇数堆,那么迪锴只能拿偶数堆,因为两头的下标都是偶数。
如果迪锴拿了左边的纸牌,杰哥也必然拿左边的纸牌,这样可以使得,两次操作后,迪锴依然只能拿偶数堆的纸牌。
既然纸牌点数之和为奇数,那么奇数组和偶数组必然有一堆最大,没有平局,所以杰哥一眼丁真,可以先手选择最大的那堆纸牌,必赢。
C语言代码
C++代码
Java代码
Python代码
F 数位除法
贪心。使用优先队列存储所有的数据,然后开始操作。
每次选择数组当前的最大值进行操作,使得数组的最大值逐渐减小。
如果最大值是2的幂次方,这意味着它在二进制表示下只有一个 1 ,那么无论再操作多少次,都不能更改数组的最大值,此时应该退出循环。
极限数据为100000 个 805306368 (3<<28),每个元素都需要操作29次,才能变为 1 ,所以数组长度至少需要开到 29e5 ,不然会越界。
考虑到 q 组询问,依然是需要预处理的,不然会超时。
C语言代码
C++代码
Java代码
Python代码
——————————————————
感谢同学们的积极参与!