蓝桥杯2024年第十五届决赛真题-数位翻转

题目描述
小明创造了一个函数 f(x) 用来翻转 x 的二进制的数位(无前导 0)。比如f(11) = 13,因为 11 = (1011)2,将其左右翻转后,变为 13 = (1101)2;再比如f(3) = 3,f(0) = 0,f(2) = f(4) = f(8) = 1 等等。

小明随机出了一个长度为 n 的整数数组 {a1, a2, …, an},他想知道,在这个数组中选择最多 m 个不相交的区间,将这些区间内的数进行二进制数位翻转(将ai 变为 f(ai))后,整个数组的和最大是多少?

输入格式
输入共 2 行。

第一行为两个正整数 n, m。

第二行为 n 个由空格分开的整数 a1, a2, …, an。

输出格式
输出共 1 行,一个整数表示答案。

样例输入
5 3
11 12 13 14 15
样例输出
67
提示
【样例说明 1】只翻转 a1,和为 13 + 12 + 13 + 14 + 15 = 67。

再比如:

【样例输入 2】6 2 23 8 11 19 16 35

【样例输出 2】134

【样例说明 2】翻转区间 [a3, a4] 和 [a6],和为 23 + 8 + 13 + 25 + 16 + 49 = 134。

【评测用例规模与约定】

对于 20% 的评测用例,保证 n, m ≤ 20。

对于 100% 的评测用例,保证 n, m ≤ 1000,0 ≤ ai ≤ 10

蓝桥杯2024第十五届省赛真题《遗迹》是一道典型的算法竞赛题目,主要考察参赛者的数学思维、数据结构应用能力以及编程实现技巧。以下是关于该题目的分析与解答思路: --- ### 题目背景 假设考古学家发现了一片古代文明遗址,并从中找到了一些刻有数字的石板。每个石板上有一个整数数组 `a` 和一个目标值 `k`。需要通过某种操作将数组调整到满足特定条件的状态。 #### 核心任务 你需要设计一种策略,在有限的操作次数内完成对数组的改造。具体规则因题目而异,常见的约束包括但不限于: 1. 每次可以对某个元素加减固定数值; 2. 最终使得所有元素之和等于目标值 `k` 或者其他复杂的关系成立。 --- ### 解答思路 针对此类问题,通常可以从以下几个方面入手思考解决方案: 1. **明确状态转移方程** 如果涉及动态规划,则需找出最优子结构性质及递推公式;如果偏向贪心法则应证明局部选择能带来全局最佳效果。 2. **运用辅助工具优化计算效率** - 利用哈希表快速查找重复项。 - 引入前缀和简化区间求和运算。 3. **边界情况处理得当** 对极端输入(如空数组或极大极小值)进行单独讨论避免程序崩溃。 例如,《遗迹》这道题可能是基于模线性同余理论构造出的答案验证模型,要求选手利用扩展欧几里德算法或其他高效手段找到可行解。 --- ### 示例代码片段 (伪代码) ```python def solve_relic(a, k): # 初始化变量 n = len(a) # 特殊情形直接返回结果 if sum(a) == k: return "Already satisfied!" operations = [] for i in range(n): diff = abs(k - a[i]) if diff != 0: operations.append((i+1, 'add', diff)) return operations # 测试示例 print(solve_relic([1, 5], 6)) # 输出可能形如 [(2,'add',1)] ``` 上述仅为简单示意,实际比赛中还需考虑更多细节才能拿到满分! --- ### 总结 解决类似“遗迹”这样的比赛难题关键在于理解命题意图并灵活调动所学知识综合应对。同时保持冷静心态认真审题也是成功的关键因素之一哦~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值