第十四届蓝桥杯省赛C++ C组所有题目以及题解(C++)【编程题均通过100%测试数据】

第一题《求和》【简单模拟】

【问题描述】

求1(含)至20230408(含)中每个数的和。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【代码】

#include <iostream>
using namespace std;
int main()
{
  long long res = 0;
  for(int i = 1;i<=20230408;i++) res += i;
  printf("%lld",res);
  // 请在此输入您的代码
  return 0;
}

【答案】

204634714038436


第二题《工作时长》【模拟】

【问题描述】

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【代码】

#include <bits/stdc++.h>
using namespace std;

//2022是平年
int Month[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};

int sum[520];
int month, day, h, mi, s; //月,日,时,分,秒

int main() {
  int ans = 0;
    for (int i = 0; i < 520; i++) {
        string str;
        getline(cin, str);
        month = (str[6] - '0') + (str[5] - '0') * 10;
        day = (str[9] - '0') + (str[8] - '0') * 10;
        h = (str[12] - '0') + (str[11] - '0') * 10;
        mi = (str[15] - '0') + (str[14] - '0') * 10;
        s = (str[18] - '0') + (str[17] - '0') * 10;
        sum[i] = (Month[month - 1] + day) * 86400 + h * 3600 + mi * 60 + s;
    }
    sort(sum, sum + 520);
    for (int i = 0; i < 520; i += 2) {
        ans += sum[i + 1] - sum[i];
    }
    cout << ans << endl;
    return 0;
}

【答案】

5101913


第三题《三国游戏》【贪心】

本题题解参考这篇博客:【贪心】第十四届蓝桥杯省赛C++ / Java / Python C组《三国游戏》(C++) 


 第四题《填充》【贪心】

本题题解参考这篇博客:【贪心】第十四届蓝桥杯省赛C++ / Java / Python C组《填充》(C++)


第五题 《翻转》【思维】

本题题解参考这篇博客:【思维】第十四届蓝桥杯省赛C++ C组/研究生组 Python A组/C组《翻转》(C++)


第六题《子矩阵》【单调队列】

本题题解参考这篇博客:【单调队列】第十四届蓝桥杯省赛C++ C组 Java C组/研究生组 Python A组《子矩阵》(C++)


第七题《互质数的个数》【欧拉函数+快速幂】

本题题解参考这篇博客:【欧拉函数+快速幂】第十四届蓝桥杯省赛C++ C组 Java A组/研究生组 Python 研究生组《互质数的个数》(C++)


第八题《异或和之差》【trie树】 

【题目描述】

给定一个含有 n 个元素的数组 A_{i},你可以选择两个不相交的子段。

求出这两个子段内的数的异或和的差值的最大值。

【输入格式】

输入的第一行包含一个整数 n。

第二行包含 n 个整数 A_{i},相邻整数之间使用一个空格分隔。

【输出格式】

输出一行包含一个整数表示答案。

【数据范围】

对于 40% 的评测用例,n ≤ 5000;
对于所有评测用例,2 ≤ n ≤ 2×10^{5},0 ≤ A_{i} ≤ 2^{20}

【输入样例】

6
1 2 4 9 2 7

【输出样例】

14

【样例解释】

两个子段可以分别选 1 和 4,9,2,差值为 15−1=14。

【思路】 

求异或最值,一般用trie树做。

trie树可以在len(num)的时间内求出与num异或最大/最小的值
题目求的是区间,我们可以维护一个前缀异或和sum[i],那么我们求一段异或和最大,也就是求前缀和中的与sum[i]异或最大的值,最小同理,

题目求的是两段区间的差值最大,因为两段区间不相交,我们可以先求出前缀的最大/最小值,后缀在求一遍,答案就是前缀最大值-后缀最小值 or 后缀最大值-前缀最小值

【代码】

#include <bits/stdc++.h>

using namespace std ;
typedef long long LL ;
typedef pair<LL,int> PLI ; 
const int N = 1e6 + 10 ; 

int  n , a[N] ; 
int son[2][N] , idx ; 
int mx[N] , mi[N] ;

void insert(int x)
{
    int p = 0 ; 
    for(int i = 20 ; i >= 0 ; i --)
    {
        int u = (x >> i) & 1 ; 
        if(!son[u][p]) son[u][p] = ++ idx ; 
        p = son[u][p] ; 
    }
}

int query_mi(int x)
{
    int p = 0 , res = 0;
    for(int i = 20 ; i >= 0 ; i --)
    {
        int u = (x >> i) & 1 ; 
        if(!son[u][p])
        {
            u = !u ; 
            res |= (1 << i) ; 
        }
        p = son[u][p] ;
    }
    return res ; 
}
int query_mx(int x)
{
    int p = 0 , res = 0;
    for(int i = 20 ; i >= 0 ; i --)
    {
        int u = (x >> i) & 1 ; 
        if(son[!u][p]) res |= (1 << i) ;
        else u = !u ;  

        p = son[!u][p] ; 
    }
    return res ; 
}


int main()
{
    cin >> n ;
    for(int i = 1 ; i <= n; i ++) cin >> a[i] ; 

    mx[0] = 0 , mi[0] = 2e9 ;
    int sum = 0 ;
    insert(sum) ; 
    for(int i = 1 ; i <= n ; i ++)
    {
        sum ^= a[i] ; 
        mx[i] = max(mx[i - 1] , query_mx(sum)) ;
        mi[i] = min(mi[i - 1] , query_mi(sum)) ; 
        insert(sum) ; 
    }

    memset(son , 0 , sizeof son) ; 
    idx = 0 ; sum = 0 ;

    int ans = 0 , mx2 = 0 , mi2 = 2e9; 
    insert(sum) ; 
    for(int i = n ; i ; i --)
    {
        sum ^= a[i] ; 
        mx2 = max(mx2 , query_mx(sum)) ; 
        mi2 = min(mi2 , query_mi(sum)) ; 

        ans = max({ans , mx[i - 1] - mi2 , mx2 - mi[i - 1]}) ; 
        insert(sum) ; 
    }

    cout << ans << endl ;
    return 0 ;
}

第九题《公因数匹配》【质因数分解】 

【题目描述】

给定 n 个正整数 A_{i},请找出两个数 i,j 使得 i<j 且 A_{i} 和 A_{j} 存在大于 1 的公因数。

如果存在多组 i,j,请输出 i 最小的那组。

如果仍然存在多组 i,j,请输出 i 最小的所有方案中 j 最小的那组。

【输入格式】

输入的第一行包含一个整数 n。

第二行包含 n 个整数分别表示 A_{1},A_{2},⋅⋅⋅,A_{n},相邻整数之间使用一个空格分隔。

【输出格式】

输出一行包含两个整数分别表示题目要求的 i,j,用一个空格分隔。

由于官方没有提及无解时如何进行输出,所以本题目前保证有解。

【数据范围】

对于 40% 的评测用例,n≤5000;
对于所有评测用例,1≤n≤10^{5},1≤Ai≤10^{6}

【输入样例】

5
5 3 2 6 9

【输出样例】

2 4

【代码】

#include <iostream>
#include <algorithm>
#include <vector>
#define x first // 宏定义,方便使用pair中的两个元素
#define y second
using namespace std;
typedef pair<int, int> PII; // 定义pair类型,用于存放下标
const int N = 1e6 + 10;
int n;
int a[N]; // a数组用于存放每个质因子在数列中最后一次出现的位置
vector<PII> v; // 存放有重叠的两个数的下标
int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++)
    {
        int x;
        scanf("%d", &x);
        // 对x进行质因数分解
        for (int j = 2; j <= x / j; j ++)
        {
            if (x % j == 0)
            {
                // 如果j已经在数列中出现过了,说明有至少一个数和当前数在j这个质因子上有重叠
                if (a[j])   v.push_back({a[j], i}); 
                else    a[j] = i; // 否则将j在a数组中标记为当前数在数列中的下标
                while (x % j == 0)  x /= j; // 将j从x中除掉,以便下一个质因子的分解
            }
        }
        if (x > 1)  
        {
            // 如果x剩下了一个大于1的质因子,同上处理
            if (a[x])   v.push_back({a[x], i});
            else    a[x] = i;
        }
    }
    sort(v.begin(), v.end()); // 按照第一个元素(之前标记的下标)排序
    printf("%d %d", v[0].x, v[0].y); // 输出第一个元素即可
    return 0;
}

第十题《子树的大小》【模拟】 

【题目描述】

【输入格式】

输入包含多组询问。

输入的第一行包含一个整数 T,表示询问次数。

接下来 T 行,每行包含三个整数 n,m,k 表示一组询问。

【输出格式】

输出 T 行,每行包含一个整数表示对应询问的答案。

【数据范围】

对于 40% 的评测用例,T≤50,n≤10^{6},m≤16;
对于所有评测用例,1≤T≤10^{5},1≤k≤n≤10^{9},2≤m≤10^{9}

【输入样例】

3
1 2 1
11 3 4
74 5 3

【输出样例】

1

2

24

【思路】

题解来源:AcWing 4971. 子树的大小 - AcWing

【代码】

#include<iostream>
#include<cstring>
#include<algorithm>

#define int long long 
using namespace std;

typedef long long ll;

int n, m;
int k;
int sum;
signed main()
{
    int T;
    cin >> T;
    while(T --)
    {
        cin >> n >> m >> k;
        int t = 1;
        sum = 1;
        while(sum < k)
        {
            t *= m;
            sum += t;
        }
        int ans  = 0, p = 1;
        int l = k - (sum - t) - 1;
        while(sum < n)
        {
            ans += p;
            l = l * m;
            t *= m;
            p *= m;
            sum += t;
        }
        n -= sum - t;
        ans += min(p, max(0ll, n - l));
        cout << ans << endl;
    }
    return 0;
}

 以上内容部分题目题解摘自他人博客题解,在题目处均已标明出处。若有侵权,私信删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/501445.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“地干天知”干旱监测与预警技术研讨及系统产品发布

3月28日&#xff0c;由国家气候中心气象灾害风险管理室、北京慧天卓特科技有限公司主办的“地干天知”干旱监测与预警技术研讨及系统产品发布活动在北京市海淀区中关村壹号隆重举办。活动旨在面向公众讲解干旱监测与预警技术原理&#xff0c;展示监测范围和预警能力。来自国家气…

protobuf学习笔记(二):结合grpc生成客户端和服务端

上一篇文章大概讲了如何将自定义的protobuf类型的message转换成相应的go文件&#xff0c;这次就结合grpc写一个比较认真的客户端和服务器端例子 一、项目结构 client存放rpc服务的客户端文件 server存放rpc服务的服务端文件 protobuf存放自定义的proto文件 grpc存放生成的g…

【LeetCode: 面试题 16.05. 阶乘尾数 + 阶乘】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

ThreadPool-线程池使用及原理

1. 线程池使用方式 示例代码&#xff1a; // 一池N线程 Executors.newFixedThreadPool(int) // 一个任务一个任务执行&#xff0c;一池一线程 Executors.newSingleThreadExecutorO // 线程池根据需求创建线程&#xff0c;可扩容&#xff0c;遇强则强 Executors.newCachedThre…

谷歌seo站内优化需要做什么?

说一个比较重要的点&#xff0c;那就是页面的标签优化&#xff0c;网站的title标签跟Descriptions标签的重要性不言而喻&#xff0c;但其他页面的标签也是同样重要&#xff0c;毕竟客户看见在谷歌搜索引擎里看见的就是你的页面标题以及描述 所以页面的标题以及描述是很重要的&a…

电机试验平台的结构

电机试验平台的结构通常包括以下部分&#xff1a; 1.电机&#xff1a;试验平台主要是为了对电机进行各种试验&#xff0c;因此电机是平台的核心组成部分。电机通常由定子和转子组成&#xff0c;根据试验需要可以是直流电机、交流电机或者是特殊类型的电机。 2.控制系统&#…

一次性了解C语言中文件和文件操作

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 文件及文件操作 前言1. 文件分类1.1 文本文件1.2 二进制文件1.3 文本文件和二进制文件的区别 2…

Linux:程序地址空间详解

目录 一、堆、栈、环境参数所在位置 二、进程地址空间底层实现原理 ​编辑 三、什么是地址空间 四、为什么要有进程地址空间 五、细谈写实拷贝的实现及意义 在C/C学习中&#xff0c;都学习过如上图所示的一套存储结构&#xff0c;我们大致知道一般存储空间分为堆区&#…

数据结构:归并排序

归并排序 时间复杂度O(N*logN) 如果两个序列有序,通过归并,可以让两个序列合并后也有序,变成一个有序的新数组 对于一个数组,如果他的左右区间都有序,就可以进行归并了 归并的方法 将数组的左右两个有序区间比较,每次都取出一个最小的,然后放入临时数组(不能在原数组上修改…

纯小白蓝桥杯备赛笔记--DAY8(必备排序算法)

冒泡排序 算法思想 每次将最大的一下一下地运到最右边&#xff0c;然后确定这个最大的&#xff0c;接着可以发现该问题变成一个更小的子问题。具体操作&#xff1a;从左向右扫描&#xff0c;如a[i]>a[i1]&#xff0c;执行swap操作。代码格式 #include<bits/stdc.h> …

Mamba: Linear-Time Sequence Modeling with Selective State Spaces(论文笔记)

What can I say? 2024年我还能说什么&#xff1f; Mamba out! 曼巴出来了&#xff01; 原文链接&#xff1a; [2312.00752] Mamba: Linear-Time Sequence Modeling with Selective State Spaces (arxiv.org) 原文笔记&#xff1a; What&#xff1a; Mamba: Linear-Time …

双非本,拿到美团测开实习了——经验分享

前言 最近是春招、暑期实习的高峰期&#xff0c;自己也凭借着持续的准备和一部分运气&#xff0c;较早拿到了美团的测开暑期实习。 以前接到美团的短信&#xff0c;都是外卖送达的通知&#xff0c;没想到自己有一天&#xff0c;也能收到offer录用的通知。虽然是测试开发的岗位…

考研数学|《1800》+《660》精华搭配混合用(经验分享)

肯定不行&#xff0c;考研数学哪有这么容易的&#xff01; 先说说这两本习题册&#xff0c;李永乐老师推出的新版660题&#xff0c;相较于18年前的版本&#xff0c;难度略有降低&#xff0c;更加适合初学者。因此&#xff0c;对于处于基础阶段的学习者来说&#xff0c;新版660…

2、Cocos Creator 下载安装

Cocos Creator 从 v2.3.2 开始接入了全新的 Dashboard 系统&#xff0c;能够同时对多版本引擎和项目进行统一升级和管理&#xff01;Cocos Dashboard 将做为 Creator 各引擎统一的下载器和启动入口&#xff0c;方便升级和管理多个版本的 Creator。还集成了统一的项目管理及创建…

算法之并查集

并查集&#xff08;Union-find Data Structure&#xff09;是一种树型的数据结构。它的特点是由子结点找到父亲结点&#xff0c;用于处理一些不交集&#xff08;Disjoint Sets&#xff09;的合并及查询问题。 Find&#xff1a;确定元素属于哪一个子集。它可以被用来确定两个元…

2024年AI大模型基础设施栈市场地图

2024年大模型(LLM)基础架构的组件和工具,最近看到国外的一篇深度分析,技术负责人可以重点关注:附带图谱: 一、现代LLM基础设施栈定义 根据Menlo Ventures的数据,2023年企业在现代AI基础设施栈上的支出超过11亿美元,成为生成式AI中最大的新市场,为初创企业提供了巨大的…

[OpenCV学习笔记]Qt+OpenCV实现图像灰度反转、对数变换和伽马变换

目录 1、介绍1.1 灰度反转1.2 图像对数变换1.3 图像伽马变换 2、效果图3、代码实现4、源码展示 1、介绍 1.1 灰度反转 灰度反转是一种线性变换&#xff0c;是将某个范围的灰度值映射到另一个范围内&#xff0c;一般是通过灰度的对调&#xff0c;突出想要查看的灰度区间。 S …

基于Springboot旅游网站管理系统设计和实现

基于Springboot旅游网站管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系…

下拉选中搜索angularjs-dropdown-multiselect.js

需要引入angularjs-dropdown-multiselect.js 页面 <div ng-dropdown-multiselect"" options"supplierList_data" selected-model"supplierList_select" events"changSelValue_supplierList" extra-settings"mucommonsetti…

python中pow()函数的使用

在Python中&#xff0c;pow() 函数用于计算指定数字的幂。它的语法如下&#xff1a; pow(x, y) 这个函数返回 x 的 y 次方。相当于 x**y。 pow() 函数也可以接受一个可选的第三个参数&#xff0c;用于指定一个取模值&#xff0c;即计算结果与该模值的余数。其语法如下&#…