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

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

时间限制: 2s 内存限制: 192MB 提交: 1046 解决: 318

题目描述

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

1.分析

偶数反转一定变小,判断奇数即可,先算出所有变大的差值,再找到差值最大的m个区间。

2.代码

cpp 复制代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int MAX = 1e5+10;
typedef long long LL;
LL n, m;
LL a[MAX],b[MAX],sum;
LL reserse(LL x) {      //反转函数
    vector<LL> v;
    while (x) {
        LL t = x & -x;
        v.push_back(t);
        x -= t;
    }
    LL t = v[v.size() - 1];
    LL re = 0;
    for (int i = 0; i < v.size(); i++) {
        re += t / v[i];
    }
    return re;
}
int main() {
    cin >> n >> m;
    for (int i = 0; i < n; i++) {   //输入
        cin >> a[i];
        sum += a[i];
    }
    for (int i = 0; i < n; i++) {
        if (a[i] % 2 != 0) {       //判断计算差值
            LL t = reserse(a[i]);
            if (t > a[i]) {
                b[i] = t - a[i];
            }
        }
    }
    LL t = 0;
    vector<LL> v;
    for (int i = 0; i < n; i++) {   //计算区间
        if (b[i]) {
            t += b[i];
        }
        else if (t != 0) {
            v.push_back(t);
            t = 0;
        }
    }
    if (t != 0) v.push_back(t);
    sort(v.begin(), v.end());
    for (int i = v.size()-1; i >=0; i--) {       //找到前m个区间
        if (v.size()-1-i<m) {
            sum += v[i];
        }
    }
    cout << sum << endl;
    return 0;
}
相关推荐
li星野12 小时前
打工人日报#20250824
程序人生·职场和发展·学习方法·程序员创富
YuTaoShao14 小时前
【LeetCode 热题 100】152. 乘积最大子数组——(解法一)递推
java·算法·leetcode·职场和发展
古译汉书1 天前
蓝桥杯算法之基础知识(2)——Python赛道
数据结构·python·算法·蓝桥杯
超级皮皮2 天前
力扣热题之stack
算法·leetcode·职场和发展
YuTaoShao2 天前
【LeetCode 热题 100】139. 单词拆分——(解法一)记忆化搜索
java·算法·leetcode·职场和发展
小南家的青蛙2 天前
LeetCode第55题 - 跳跃游戏
算法·leetcode·职场和发展
蒋星熠2 天前
全栈开发:从LAMP到云原生的技术革命
微服务·云原生·职场和发展·架构·系统架构·web·devops
测试19983 天前
Web自动化测试:测试用例流程设计
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
慧翔天地人才发展学苑3 天前
大厂求职 | 2026海尔校园招聘,启动!
职场和发展·跳槽·求职招聘·职场·秋招·职场晋升
秋名山码民3 天前
面试压力测试破解:如何从容应对棘手问题与挑战
面试·职场和发展·压力测试