Dotcpp  >  编程题库  >  蓝桥杯2024年第十五届决赛真题-数位翻转
题目 3293:

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

时间限制: 2s 内存限制: 192MB 提交: 142 解决: 58

题目描述

小明创造了一个函数 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 223 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 ≤ 109

标签