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

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

第1题 —— 求余 (5分)

  • 直接输出2021%20
  • 答案:1
#include<bits/stdc++.h>
using namespace std;

int main(){
    cout<<2021%20;
    return 0;
}

第2题 —— 双阶乘 (5分)

  • 求2021的双阶乘,即把1到2021的奇数乘起来,2021!! = 2021 × 2019 × · · · × 5 × 3 × 1。
  • 对于取后5位的操作,以及防止爆LL,可以直接mod1e5
  • 答案:59375
#include<bits/stdc++.h>
using namespace std;

int main(){
    int res = 1;
    for(int i = 1; i <= 2021; i+=2){
        res = res*i%100000;
    }
    cout<<res<<"\n";
    return 0;
}

第3题 —— 格点 (10分)

  • 求第一象限的格点中,有多少点两维坐标乘积不超过 2021
  • 直接暴力x,y从1到2021乘起来即可
  • 答案:15698
#include<bits/stdc++.h>
using namespace std;

int main(){
    int res = 0;
    for(int x = 1; x <= 2021; x++){
        for(int y = 1; y <= 2021; y++){
            if(x*y<=2021){
                res++;
            }
        }
    }
    cout<<res<<"\n";
    return 0;
}

第4题 —— 整数分解 (10分)

  • 将 2021 分解成五个正整数的和,
  • 注意到顺序不同算不同的方法,所以可以先暴力前三个数和为某值的方案存下来,再暴力后两个数为某值的方案,统计答案。
  • 答案:691677274345
#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const LL maxn = 1e5+10;
int f[maxn];

int main(){
    LL res = 0;
    for(int i = 1; i < 2021; i++){
        for(int j = 1; j < 2021; j++){
            if(i+j>2021)break;
            for(int k = 1; k < 2021; k++){
                if(i+j+k>2021)break;
                f[i+j+k]++;
            }
        }
    }
    for(int i = 1; i < 2021; i++){
        for(int j = 1; j < 2021; j++){
            if(i+j>2021)break;
            res += f[2021-(i+j)];//出现2021-(i+j)的次数++
        }
    }
    cout<<res;
    return 0;
}

第5题 —— 城邦 (15分)

  • 2021个点,任意两点间有边,边权两点不同的数位上的数字之和,求最小生成树
  • 跑Kruskal板子即可
  • 答案:4046
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2050*2050;

int fa[maxn+10];
void init(int n){for(int i = 1; i <= n; i++)fa[i]=i;}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}

struct node{int u, v, w; }e[maxn];
bool cmp(node x, node y){return x.w<y.w; }
int get(int x, int y){
    int res = 0;
    while(x || y){
        int a = x%10, b = y%10;
        if(a!=b)res += a+b;
        x /= 10, y /= 10;
    }
    return res;
}

int main(){
    int n = 2021, m = 0;
    for(int i = 1; i <= 2021; i++){
        for(int j = 1; j <= 2021; j++){
            e[m++] = {i,j,get(i,j)};
        }
    }
    sort(e,e+m,cmp);
    int res = 0;
    init(n);
    for(int i = 0; i < m; i++){
        int x = e[i].u, y = e[i].v;
        if(find(x)!=find(y)){
            fa[find(x)] = find(y);
            res += e[i].w;
        }
    }
    cout<<res<<"\n";
    return 0;
}

第6题 —— 特殊年份 (15分)

  • 判断输入年份是否满足千位和十位相等,个位比百位大 1,直接输出。
#include<bits/stdc++.h>
using namespace std;

int main(){
    int res = 0;
    for(int i = 1; i <= 5; i++){
        string s;  cin>>s;
        res += (s[0]==s[2] && s[3]-s[1]==1);
    }
    cout<<res;
    return 0;
}

第7题 —— 小平方 (20分)

  • 求 1 到 n−1 中,有多少个数平方后膜n的余数,小于n的一半。
  • n只有1w,枚举即可。
  • 题目没说怎么取整 所以就double。
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;  cin>>n;
    double bn = n/2.0; //没说怎么取整 所以就double
    int res = 0;
    for(int i = 1; i < n; i++){
        if(i*i%n<bn)res++;
    }
    cout<<res<<"\n";
    return 0;
}

第8题 —— 完全平方数 (20分)

  • 给出数a,求最小的数b,使得ab为完全平方数。
  • 从小到大枚举b,乘起来判断一下。 30%分
  • 从小到大枚举i,如果能整除,就计算i*i/n作为答案。50%
  • 考虑到完全平方数的性质,即最后ab的所有质因子肯定都是偶数个,所以直接对a质因数分解,奇数个的乘上,就是最后的答案。
#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

int main(){
    LL a;  cin>>a;
    LL b = 1;
    for(LL i = 2; i<=a/i; i++){
        int t = 0;
        while(a%i==0){
            a /= i;
            t++;
        }
        if(t%2==1)b*=i;
    }
    if(a!=1)b*=a;
    cout<<b;
    return 0;
}

第9题 —— 负载均衡 (25分)

  • 开个优先队列数组模拟即可,每个队列维持上一次剩余的体力的状态,并且只在下一个数据要进来时才去更新,即把已经算完的任务移除掉,并收回算力。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
typedef pair<int,int> PII;

//第i台计算机a[i]的剩余算力, <结束时间, 所需算力>按时间升序排序
pair<int, priority_queue<PII, vector<PII>, greater<PII> > >p[maxn];

int main(){
    int n, m; cin>>n>>m;
    for(int i =1; i <= n; i++)cin>>p[i].first;
    int a, b, c, d;
    for(int i = 1; i <= m; i++){
        cin>>a>>b>>c>>d;
        auto &q = p[b].second;
        while(q.size() && q.top().first<=a){
            p[b].first+=q.top().second;
            q.pop();
        }
        if(p[b].first >= d){
            q.push({a+c,d});
            p[b].first -= d;
            cout<<p[b].first<<"\n";
        }else{
            cout<<"-1\n";
        }
    }
    return 0;
}

第10题 —— 国际象棋 (25分)

  • 和八皇后一样,直接回溯暴力答案该能拿到30%。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int mod = 1000000007;

int n, m, k;
int dd[8][2] ={{1,2},   {1,-2},   {-1,2},   {-1,-2},   {2,1},  {2,-1},  {-2,1}  ,{-2,-1}  }; 
int vis[20][200];  //表示能不能走
int res = 0;
void dfs(int x, int y, int num){
    if(x==n&&y==0)return ;
    dfs(x+(y+1)/m, (y+1)%m, num);
    if(vis[x][y]==0){ //可以放
        if(num+1 == k){
            res = (res+1)%mod;
            return ;
        }
        vector<PII>pa;
        vis[x][y] = 1; //放下去了
        for(int i = 0; i < 8; i++){
            int nx = x+dd[i][0], ny = y+dd[i][1];
            if(nx<n&&nx>=0 && ny<m&&ny>=0 && vis[nx][ny]==0){
                pa.push_back({nx,ny});
                vis[nx][ny] = 1;
            }
        }
        dfs(x+(y+1)/m, (y+1)%m, num+1);
        vis[x][y] = 0;//回溯
        for(auto &a: pa){
            vis[a.first][a.second] = 0;
        }
    }
}

int main(){
    cin>>n>>m>>k;
    dfs(0,0,0);
    cout<<res<<'\n';
    return 0;
}

——————————————————

附:本节补题官网未上传,因此代码只能过样例。

目录
相关文章
|
2月前
|
负载均衡 算法 安全
探秘:基于 C++ 的局域网电脑控制软件自适应指令分发算法
在现代企业信息化架构中,局域网电脑控制软件如同“指挥官”,通过自适应指令分发算法动态调整指令发送节奏与数据量,确保不同性能的终端设备高效运行。基于C++语言,利用套接字实现稳定连接和线程同步管理,结合实时状态反馈,优化指令分发策略,提升整体管控效率,保障网络稳定,助力数字化办公。
71 19
|
5月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
5月前
|
人工智能 算法 BI
第十四届蓝桥杯省赛大学C组(C/C++)三国游戏
第十四届蓝桥杯省赛大学C组(C/C++)三国游戏
|
5月前
|
人工智能 C++
第十四届蓝桥杯省赛大学B组(C/C++)整数删除
第十四届蓝桥杯省赛大学B组(C/C++)整数删除
|
3月前
|
算法 安全 C++
用 C++ 算法控制员工上网的软件,关键逻辑是啥?来深度解读下
在企业信息化管理中,控制员工上网的软件成为保障网络秩序与提升办公效率的关键工具。该软件基于C++语言,融合红黑树、令牌桶和滑动窗口等算法,实现网址精准过滤、流量均衡分配及异常连接监测。通过高效的数据结构与算法设计,确保企业网络资源优化配置与安全防护升级,同时尊重员工权益,助力企业数字化发展。
73 4
|
5月前
|
机器学习/深度学习 算法 关系型数据库
第十五届蓝桥杯C++B组省赛
第十五届蓝桥杯C++B组省赛
197 14
|
5月前
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
128 5
|
7月前
|
安全 网络安全 数据安全/隐私保护
探索企业上网行为管理软件:C++ 的视角
在数字化企业环境中,上网行为管理软件至关重要,它不仅保障信息安全还优化网络资源分配。C++以高效和强大性能为基础,支持这类软件的开发。通过示例代码展示了如何使用C++捕获网络数据包、控制特定网址访问及分析网络流量模式,展现了C++在处理大规模网络数据方面的优势,满足企业对网络安全与管理的需求。
59 1
|
9月前
|
存储 算法 测试技术
第十五届蓝桥杯大赛 国赛 pb组F题【括号与字母】(15分) 栈的应用
第十五届蓝桥杯大赛 国赛 pb组F题【括号与字母】(15分) 栈的应用
70 1
|
9月前
|
Java
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
58 1

热门文章

最新文章