2022 第十三届蓝桥杯大赛软件赛省赛(第二场),C/C++ 大学B组题解

news2024/10/6 16:31:56

2022 第十三届蓝桥杯大赛软件赛省赛(第二场),C/C++ 大学B组题解

文章目录

      • 第1题 —— 练习 (5分)
      • 第2题 —— 三角回文数 (5分)
      • 第3题 —— 卡片 (10分)
      • 第4题 —— 考勤刷卡 (10分)
      • 第5题 —— 最大和 (15分)
      • 第6题 —— 染色时间 (15分)
      • 第7题 —— k 倍区间 (20分)
      • 第8题 —— 选素数 (20分)
      • 第9题 —— 第几小 (25分)
      • 第10题 —— 单峰序列 (25分)

补题链接:地址

在这里插入图片描述

第1题 —— 练习 (5分)

在这里插入图片描述

  • 题意:过了样例交上去0分,问可能是ABC的哪一种
  • 显然都是,答案:ABC
#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
  cout<<"ABC";
  return 0;
}

第2题 —— 三角回文数 (5分)

在这里插入图片描述

  • 题意:求第一个大于某2e8的数的回文数,且满足他可以等于1+2+…某个k。

  • 一种是从2e8开始往上枚举,判断每个数是不是回文+三角,三角可以根号再乘附近的几个数特判一下。
    另一种是枚举三角,1+2+…k,判断是不是回文和大于2e8,+k加到后面就是指数级了,上升也很快。

  • 答案:35133153

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

int main(){
    int x = 0;
    for(int i = 1; ; i++){
        x += i;
        if(x <= 20220514)continue;
        string s = to_string(x);
        string t = s;
        reverse(t.begin(),t.end());
        if(s==t)break;
    }
    cout<<x<<"\n";
    return 0;
}

第3题 —— 卡片 (10分)

在这里插入图片描述

  • 题意:n个人,给每个人随机发两张卡片(可以相同,没有顺序),求至少需要有多少种卡片,才能让n个人拿到的卡片组合都不同。
  • 看一下样例,明显C(k,2)>=n,求k。(k-1)k/2>=n,可以跟上一题一样枚举,a[i]=a[i-1]+1递推上去即可。
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;  cin>>n;
    int i, x = 0;
    for(i = 1; ; i++){
        x += i;
        if(x < n)continue;
        break;
    }
    cout<<i<<"\n";
    return 0;
}


第4题 —— 考勤刷卡 (10分)

在这里插入图片描述
在这里插入图片描述

  • 题意:n(1e4)条考勤记录,按顺序输出每个考勤了的员工的编号。
  • 丢到set里输出就行,时间不用管。
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;  cin>>n;
    set<int>se;
    for(int i = 1; i <= n; i++){
        string t; int id;  cin>>t>>id;
        se.insert(id);
    }
    for(auto x : se){
        cout<<x<<"\n";
    }
    return 0;
}

第5题 —— 最大和 (15分)

在这里插入图片描述
在这里插入图片描述

  • 题意:1-n共n个格子,每个格子有个分数(可能负数),开始站在1,下次可以跳到p+1到p+D(n-p)中的任意格子,D(x)为x的最小质因数,问能获得的最大分是多少。
  • 数据范围n是1e4,感觉是个dp,状态到n为止能获得的最大分。 宝物绝对值不超过1e5,暴力转移的时候质因数分解logn(或者根号n直接暴力1e3最小质因数也可以的), nlogn刚好可以过。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int a[maxn], f[maxn];

int isprime(int x){ //判断素数
    for(int i = 2; i*i <= x; i++){
        if(x%i==0)return 0;
    }
    return 1;
}
int find(int x){//找最小质因数
    if(x==0 || x==1)return x;
    for(int i = 2; i*i <= x; i++){
        if(x%i==0 && isprime(i))return i;
    }
}

int main(){
    int n;  cin>>n;
    for(int i = 1; i <= n; i++)cin>>a[i];
    memset(f, 0xc0, sizeof(f));
    f[1] = a[1];
    for(int i = 1; i <= n; i++){
        int x = i+find(n-i);  //最小质因数
        for(int j = i+1; j <= x; j++){
            f[j] = max(f[j], f[i]+a[j]);
        }
    }
    cout<<f[n]<<"\n";
    return 0;
}


第6题 —— 染色时间 (15分)

在这里插入图片描述
在这里插入图片描述

  • 题意:给出nm的棋盘,初始都是白色,每个格子被染色后等aij秒变色,变色后对四周的格子都染色,每个格子只能被染色一次。时刻0对a00染色,求多少时间染完棋盘。
  • 感觉暴力bfs遍历就行,加个堆每次取出当前最早变色的格子出来给周围的染一下,然后维护下每个格子有没有都被染过就行。数据范围500可以说是随便怎么写都行了。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 510;
int a[maxn][maxn], vis[maxn][maxn];

struct node{int x, y, time;}; //完成变色的时间
bool operator < (node a, node b){ return a.time > b.time; }
priority_queue<node, vector<node>, less<node> >q;
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };

int main(){
    int n, m;  cin>>n>>m;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            cin>>a[i][j];
        }
    }
    int res = 0;
    q.push((node){1, 1, a[1][1]});
    vis[0][0] = 1;
    while(q.size()){
        node t = q.top();  q.pop();
        res = max(res, t.time);
        for(int i = 0; i < 4; i++){
            int nx = t.x+dx[i], ny = t.y+dy[i];
            if(nx>=1&&nx<=n && ny>=1&&ny<=m && vis[nx][ny]==0){//没染过色
                vis[nx][ny] = 1;
                q.push((node){nx,ny, t.time+a[nx][ny]});
            }
        }
    }
    cout<<res<<"\n";
    return 0;
}


第7题 —— k 倍区间 (20分)

在这里插入图片描述
在这里插入图片描述

  • 题意: 给出一个序列和一个k,求有多少个子区间的区间和是k的整数倍。
  • 数据范围1e5,枚举所有区间是做不到了的, nlogn估计往数据结构去想,但是求子区间和无非也就是差分前缀和。
  • 考虑前缀和求区间和,a[r]-a[l-1]是k的倍数,那么只要%k余数相同就好了,不难处理出过程中的前缀和值,然后前面有多少个跟当前%k余数相同的值,就是有多少个区间,扫一遍O(n)就行了(当然排序二分也是可以的,复杂度都一样,map查询logn,大家半斤八两)。
  • 注意到一个坑点,不能是负整数倍,所以不能简单的累加,每次要遍历一遍%k余数的,要满足前面那个数比当前这个大才行。还有就是1e9的前缀和要开longlong。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
map<int,vector<LL>>mp; //mp[x]: 维护余数为x的前缀和有哪些
LL s[4]; //前缀和, 滚动数组

int main(){
    int n, k;  cin>>n>>k;
    LL ans = 0;
    mp[0].push_back(0); //别忘了
    for(int i = 1; i <= n; i++){
        int x;  cin>>x;
        s[i%2] = s[(i-1+2)%2]+x;
        int r = (s[i%2]%k+k)%k; //%k余数
        int len = mp[r].size();
        for(int j = 0; j < len; j++){
            if(mp[r][j] <= s[i%2])ans++;
        }
        // sort(mp[r].begin(), mp[r].end());
        // ans += upper_bound(mp[r].begin(), mp[r].end(), s[i%2])-mp[r].begin();
        mp[r].push_back(s[i%2]);
    }
    cout<<ans<<"\n";
    return 0;
}


第8题 —— 选素数 (20分)

在这里插入图片描述
在这里插入图片描述

  • 题意:给你两个数,s和t,每回合可以选一个小于s且不是s因数的素数p,然后找到p的倍数中刚好大于s的那个数y,并让s=y,进入下一回合。 求多少回合后s>t。
  • 这题官网没有提交链接啊,代码补了对不对也不知道,我就不写了。。。(名正言顺的翘了摸鱼去了)
  • 思路方向:
    最大数据询问2e5,st 1e7,明显是个结论题, 可以找找规律。
    20%的数据明显照着模拟就送。
    50%数据500组,5e5,大概是优化下暴力,nlogn的复杂度,素数可以线性筛O(n)筛出来,个数大概是根号n,每次枚举每个素数,然后找倍数O1就够,如果满足条件就进入下一回合了,复杂度n根号n应该是可以拿到50%的。
    或者,emmm,s-1,s-2这种很接近的数里应该有素数吧,并且肯定不是s的因数了,那么就O1过去了? 结论的话,盲猜跟gcd有点关系,不知道对不对,可以找找规律蛤。

第9题 —— 第几小 (25分)

在这里插入图片描述
在这里插入图片描述

  • 题意:给一个数组,支持单点修改,以及求区间中比a[p]小的数的个数, a[p]在区间内。n是1e5,操作是2e5。
  • 思路:首先,感觉暴力扫区间乱搞之类的可以拿40%。。1e5这种明显数据结构,区间操作就线段树。分块之类的应该也可以,一下子没想到线段树怎么维护,主席树第k小值应该可以做,感觉都有点长懒得写了,直接放一个可以过的分块代码
//分块可以AC 20个点的块长, sqrt(n)*5

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

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n;  cin>>n;
    vector<int> a(n+1,0);

    //分块
    int len = sqrt(n)*5; //块长
    int k = (n%len==0)?n/len:n/len+1;//块数
    vector<int> block[k+1]; //本体
    vector<int> belong(n+1,0);
    int blockNum = 0;
    for(int i=1;i<=n;i++){ //分块
        cin>>a[i];
        blockNum=(i-1)/len+1;
        belong[i]=blockNum;
        block[blockNum].push_back(a[i]);
    }
    for(int i=1;i<=k;i++){  //块排序
        sort(block[i].begin(),block[i].end(),less<int>());
    }

    //输入操作
    int m;  cin>>m;
    vector<vector<int>> op(m,vector<int>(4,0));
    for(int i=0;i<m;i++){
        cin>>op[i][0];
        cin>>op[i][1]>>op[i][2];
        if(op[i][0]==2)cin>>op[i][3];
    }
    //执行
    vector<int> res;
    for(int i = 0; i < m; i++){
        int num1=op[i][1], num2=op[i][2], num3=op[i][3];
        if(op[i][0]==1){ //修改
            auto it=lower_bound(block[belong[num1]].begin(),block[belong[num1]].end(),a[num1]);
            block[belong[num1]].erase(it);
            it=lower_bound(block[belong[num1]].begin(),block[belong[num1]].end(),num2);
            if(it==block[belong[num1]].end())block[belong[num1]].push_back(num2);
            else block[belong[num1]].insert(it,num2);
            a[num1] = num2;
        }else{ //查询
            int count = 0, mid = a[num3];
            //先查左右两端分块中满足条件的元组数,因为num1和num2所在的块不一定一整块都参与比较
            for(int j=num1;j<=min(num2,belong[num1]*len);j++){
                if(a[j]<mid)count++;
            }
            if(belong[num1]!=belong[num2]){
                for(int j=(belong[num2]-1)*len+1;j<=num2;j++){
                    if(a[j]<mid)count++;
                }
            }
            //区间查询,用二分法查询每个块中小于a[p]的元素个数
            for(int j=belong[num1]+1;j<=belong[num2]-1;j++){
                count+=lower_bound(block[j].begin(),block[j].end(),a[num3])-block[j].begin();
            }
            res.push_back(count+1);
        }
    }
    for(auto &&num:res)cout<<num<<" ";
    return 0;
}


第10题 —— 单峰序列 (25分)

在这里插入图片描述
在这里插入图片描述

  • 题意:给出n和m,求构造序列满足长度1-n,和为m,且序列存在一个最高峰,左边递增右边递减,nm都是1e5,求可行的构造方案数。
  • 显然是个dp,开始不难盲猜状态dp[i][j]为,长为i,总和为j的,满足xx条件的的个数,但是原先那个条件显然不太好转移, 考虑把条件改为严格递增,然后手动选取k点让严格递增的序列在k点左右两边自由组合,那么方案数就是排列组合2^x,可以算得出来。
  • 转移就是长度i-1的加个数字过来,或者和为j-i的每个数加个1过来。因为需要包含最小元素1,所以先固定一个1,dp[i-1][j-1-(i-1)]=dp[i-1][j-i]。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod = 1e9+7;
LL pows(LL a, LL x, LL p){if(x==0)return 1; LL t = pows(a, x>>1,p);if(x%2==0)return t*t%p;return t*t%p*a%p;}

int main(){
    int n, m;  cin>>n>>m;
    int nn = sqrt(2*m)+2;
    while(nn*(nn+1)>2*m)nn--;
    n = min(n, nn);
    //dp
    vector<vector<LL>>f(n+1, vector<LL>(m+1));
    LL res = 1;
    for(int i = 0; i <= m; i++)f[1][i] = 1;
    for(int i = 2; i <= n; i++){
        for(int j = 1; j <= m; j++){
            if(i>=j)continue;
            f[i][j] = (f[i][j-i]+f[i-1][j-i])%mod;
        }
    }
    for(int i = 2; i <= n; i++){
        res = (res+(f[i][m]*pows(2, i-1, mod))%mod)%mod;
    }
    cout<<res<<"\n";
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考A计划-真题-分类精讲汇总-第九章(数据结构与算法基础)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

Unity VR开发教程 OpenXR+XR Interaction Toolkit (一) 安装和配置

文章目录 &#x1f4d5;前言❓什么是 OpenXR❓什么是 XR Interaction Toolkit &#x1f4d5;教程说明&#x1f4d5;第一步&#xff1a;导入 OpenXR&#x1f4d5;第二步&#xff1a;导入 XR Interaction Toolkit⭐导入 Starter Assets⭐添加 Preset⭐设置 Preset Manager 的 Fil…

VLAN(含配置命令行)

一、VLAN的概念及优势 虚拟局域网&#xff08;VLAN&#xff09;是一组逻辑上的设备和用户&#xff0c;这些设备和用户并不受物理位置的限制&#xff0c;可以根据功能、部门及应用等因素将它们组织起来&#xff0c;相互之间的通信就好像它们在同一个网段中一样&#xff0c;由此得…

分布式计算实验4 随机信号分析系统

一、实验要求 利用MOM消息队列技术实现一个分布式随机信号分析系统&#xff0c;具体要求&#xff1a; 1.随机信号产生器微服务每隔100毫秒左右就产生一个正态分布的随机数字&#xff0c;并作为一个消息发布。 2.一个随机信号统计分析微服务&#xff0c;对信号进行如下分析&a…

【开发工具 - vscode】vscode配置C/C++运行环境

【开发工具 - VSCode】vscode配置C/C环境 准备工作第一步 下载vscode第二步 下载mingw第三步 将mingw添加至系统变量中第四步 打开VsCode安装一下必要的插件 正式开始配置第一步 新建个存放C/C文件的文件夹&#xff0c;并新建个cpp文件配置方法一 借助run code 插件的配置方法 …

c语言平方(c语言平方怎么打)

C语言中怎么求平方 a^6 是a和6的异或&#xff0c;并不是5的6次幂。 你的程序会如下计算&#xff1a; 5是101 &#xff0c;6是110&#xff0c;你的答案你一定是011&#xff0c;也就是3~C语言中^是指抑或运算符&#xff0c;不是求幂的。你要求平方就 ba*a;6次方就乘6次。#include…

java调用chatgpt接口,实现专属于自己的人工智能助手

文章目录 前言导包基本说明请求参数响应参数创建请求和响应的VO类 代码编写使用最后说明 前言 今天突然突发奇想&#xff0c;就想要用java来调用chatget的接口&#xff0c;实现自己的聊天机器人&#xff0c;但是网上找文章&#xff0c;属实是少的可怜(可能是不让发吧)。找到了…

Unity鼠标带动物体运动的三种方法

目录 第一种&#xff1a;物体跟随鼠标移动。 第二种&#xff1a;鼠标拖动物体运动。 第三种&#xff1a;鼠标点到哪&#xff0c;物体运动到哪。 第一种&#xff1a;物体跟随鼠标移动。 描述&#xff1a;鼠标左键点击物体&#xff0c;将物体拾起&#xff0c;松开鼠标左键&…

每日一练蓝桥杯C语言:2020年真题题集(B组)

在这里我给大家推荐一款不错刷算法学习网站&#xff1a;点击这处链接牛客网&#xff1b;牛客网作为国内内容超级丰富的 IT 题库&#xff0c;各种东西看的我眼花缭乱&#xff0c;题库面试学习求职讨论大厂内推等等服务&#xff0c;堪称"互联网求职神器"。它好就好在不…

MySQL(九):MVCC能否解决幻读问题

尺有所短&#xff0c;寸有所长&#xff1b;不忘初心&#xff0c;方得始终。 请关注公众号&#xff1a;星河之码 幻读【前后多次读取&#xff0c;数据总量不一致】 同一个事务里面连续执行两次同样的sql语句&#xff0c;可能导致不同结果的问题&#xff0c;第二次sql语句可能会返…

CSS3动画属性 animation详解(看完就会)

CSS3动画属性 animation 文章包含个人理解错误请指出 往期文章 【css高级】变量详解 轮播图swiper框架的基本使用【Transform3D】转换详解&#xff08;看完就会&#xff09;【css动画】移动的小车 【CSS3】 float浮动与position定位常见问题&#xff08;个人笔记&#xff09…

MySQL入门安装(一步一图)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

三极管工作原理介绍(动画图解)

三极管BJT 各位社区的小伙伴们大家好&#xff0c;相信大家也像我一样&#xff0c;因为上学的时候学过&#xff0c;但是呢&#xff0c;出社会不怎么用&#xff0c;久而久之就忘了&#xff0c;今天来给大家巩固一下&#xff0c;我对三极管的通俗易懂的工作原理介绍&#xff01; 半…

怎样提高报表呈现的性能

报表的性能很重要&#xff0c;是一个总被谈及的问题&#xff0c;跑的慢的报表用户体验恶劣&#xff0c;无法忍受。解决这些慢的性能问题&#xff0c;也成了项目方和工程师头疼的事情。一出状况&#xff0c;就得安排技术好的&#xff0c;能力强的工程师去救火&#xff0c;本来利…

『赠书活动 | 第二期』《元宇宙Ⅱ:图解元技术区块链、元资产与Web3.0、元人与理想国(全三册)》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第二期』 本期书籍&#xff1a;《元宇宙Ⅱ&#xff1a;图解元技术区块链、元资产与Web3.0、元人与理想国》 赠书规则&#xff1a;评论区&…

齐全且实用的MySQL函数使用大全

目录 一、MySQL函数介绍 二、MySQL函数分类 &#xff08;一&#xff09;单行函数 ①字符串函数 ②数学函数 ③日期函数 ④流程控制函数 ⑤系统信息函数 ⑥其他函数 &#xff08;二&#xff09;聚合函数 三、函数使用示例 &#xff08;一&#xff09;字符函数 ①le…

【K8S系列】深入解析etcd

序言 时间永远是旁观者&#xff0c;所有的过程和结果&#xff0c;都需要我们自己去承担。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 Kubernetes (k8s) 是一个容器…

WeIdentity智能合约源码分析

WeIdentity智能合约 介绍 本文结合WeIdentity智能合约文档对其源码进行阅读分析。当前&#xff0c;WeIdentity合约层面的工作目标主要包括两部分&#xff1a; WeIdentity DID智能合约&#xff0c;负责链上ID体系建立&#xff0c;具体包括生成DID&#xff08;Distributed IDe…

【C++】vector类详细总结(包括vector二维数组)(持续更新中)

目录 一、vector的初始化&#xff08;9种&#xff09; 二、vector的访问和遍历 2.1 访问&#xff08;3种&#xff09; &#xff08;1&#xff09;使用下标运算符[]访问和修改 &#xff08;2&#xff09;使用迭代器访问 &#xff08;3&#xff09;使用at()函数访问 &#…

Spring Boot配置多数据源的四种方式

1、导读 在日常开发中我们都是以单个数据库进行开发&#xff0c;在小型项目中是完全能够满足需求的。 但是&#xff0c;当我们牵扯到像淘宝、京东这样的大型项目的时候&#xff0c;单个数据库就难以承受用户的CRUD操作。 那么此时&#xff0c;我们就需要使用多个数据源进行读写…