第十二届蓝桥杯省赛第二场C++B组 真题题解(详细讲解+代码分析)看这篇就够了~~~

Posted 满天星!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十二届蓝桥杯省赛第二场C++B组 真题题解(详细讲解+代码分析)看这篇就够了~~~相关的知识,希望对你有一定的参考价值。

第十二届蓝桥杯省赛第二场C++B组 真题题解

求余

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()

    cout<<2021%20<<endl;
    return 0;

//答案 1

双阶乘

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()

    int ans=1;
    for(int i=1;i<=2021;i+=2)
    
        ans=ans*i%100000;
    
    cout<<ans<<endl;
    return 0;

// 答案:59375

格点

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()

    int ans=0;
    for(int x=1;x<=2021;x++)
    for(int y=1;y*x<=2021;y++)
    
        ans++;
    
    cout<<ans<<endl;
    return 0;

// 答案:15698

整数分解

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()

    ll ans=1;
    for(int i=2020,j=1;j<=4;i--,j++)
    
        ans=ans*i/j;
    
    cout<<ans<<endl;
    return 0;

// 答案:691677274345

城邦

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=2030, M=N*N/2;
int n=2021,m;
int p[N];
struct Edge

    int a, b, c;
    bool operator<(const Edge& t) const
    
        return c<t.c;
    
e[M];
int find(int x)  // 并查集

    if(p[x]!=x) p[x] = find(p[x]);
    return p[x];

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()

    for (int i=1;i<=n;i++) p[i]=i;
    for (int i=1;i<= n; i++ )
        for (int j=i+1; j<=n; j++)
            e[m++]=i,j,get(i,j);
    sort(e,e+m);
    int ans = 0;
    for(int i=0;i<m;i++)
    
        int a=e[i].a,b=e[i].b,c=e[i].c;
        if (find(a)!=find(b))
        
            ans+=c;
            p[find(a)]=find(b);
        
    
    cout<<ans<<endl;
    return 0;

// 答案:4046

特殊年份

题目描述:
今年是 2021 年,2021 这个数字非常特殊,它的千位和十位相等,个位比百位大 1,我们称满足这样条件的年份为特殊年份。
输入 5 个年份,请计算这里面有多少个特殊年份。

输入格式
输入 5 行,每行一个 4 位十进制数(数值范围为 1000 至 9999),表示一个年份。

输出格式
输出一个整数,表示输入的 5 个年份中有多少个特殊年份。

输入样例:

2019
2021
1920
2120
9899

输出样例:

2

样例解释
2021 和 9899 是特殊年份,其它不是特殊年份。

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()

    string s;
    int ans=0;
    for(int i=0;i<5;i++)
    
        cin>>s;
        if(s[0]==s[2]&&s[3]-s[1]==1) ans++;
    
    cout<<ans<<endl;
    return 0;

小平方

题目描述:
小蓝发现,对于一个正整数 n 和一个小于 n 的正整数 v,将 v 平方后对 n 取余可能小于 n 的一半,也可能大于等于 n 的一半。
请问,在 1 到 n−1 中,有多少个数平方后除以 n 的余数小于 n 的一半。
例如,当 n=4 时,1,2,3 的平方除以 4 的余数都小于 4 的一半。
又如,当 n=5 时,1,4 的平方除以 5 的余数都是 1,小于 5 的一半。
而 2,3 的平方除以 5 的余数都是 4,大于等于 5 的一半。

输入格式
输入一行包含一个整数 n。

输出格式
输出一个整数,表示满足条件的数的数量。

数据范围
1≤n≤10000
输入样例:

5

输出样例:

2

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()

    int n;
    cin>>n;
    int ans=0;
    for(int i=1;i<n;i++)
    
        if(i*i%n*2<n) ans++;
    
    cout<<ans<<endl;
    return 0;

完全平方数

题目描述:
一个整数 a 是一个完全平方数,是指它是某一个整数的平方,即存在一个整数 b,使得 a=b2。
给定一个正整数 n,请找到最小的正整数 x,使得它们的乘积是一个完全平方数。

输入格式
输入一行包含一个正整数 n。

输出格式
输出找到的最小的正整数 x。

数据范围
对于 30% 的评测用例,1≤n≤1000,答案不超过 1000。
对于 60% 的评测用例,1≤n≤108,答案不超过 108。
对于所有评测用例,1≤n≤1012,答案不超过 1012。

输入样例1:

12

输出样例1:

3

输入样例2:

15

输出样例2:

15

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()

    ll n,res=1;
    cin>>n;
    for(ll i=2;i*i<=n;i++) //枚举质因子,从小的开始枚举,小于根号n的
    
        if(n%i==0)
        
            int sum=0;  //sum为计数质因子的次数
            while(n%i==0)
            
                n/=i,sum++;
            
            if(sum%2) res*=i;  //如果某个质因数的次数是奇数次,那么再乘上该质因数后的次数就为偶数次方了
        
    
    if(n>1) res*=n; //说明还存在一个质因子,且它的次数为1,那就再乘上它。这个质因子是大于根号n的
    cout<<res<<endl;
    return 0;

负载均衡

题目描述:
有 n 台计算机,第 i 台计算机的运算能力为 vi。
有一系列的任务被指派到各个计算机上,第 i 个任务在 ai 时刻分配,指定计算机编号为 bi,耗时为 ci 且算力消耗为 di。
如果此任务成功分配,将立刻开始运行,期间持续占用 bi 号计算机 di 的算力,持续 ci 秒。
对于每次任务分配,如果计算机剩余的运算能力不足则输出 −1,并取消这次分配,否则输出分配完这个任务后这台计算机的剩余运算能力。

输入格式
输入的第一行包含两个整数 n,m,分别表示计算机数目和要分配的任务数。
第二行包含 n 个整数 v1,v2,⋅⋅⋅vn,分别表示每个计算机的运算能力。
接下来 m 行每行 4 个整数 ai,bi,ci,di,意义如上所述。数据保证 ai 严格递增,即 ai<ai+1。

输出格式
输出 m 行,每行包含一个数,对应每次任务分配的结果。

数据范围
对于 20% 的评测用例,n,m≤200。
对于 40% 的评测用例,n,m≤2000。
对于所有评测用例,1≤n,m≤200000,1≤ai,ci,di,vi≤109,1≤bi≤n。

输入样例:

2 6
5 5
1 1 5 3
2 2 2 6
3 1 2 3
4 1 6 1
5 1 3 3
6 1 3 4

输出样例:

2
-1
-1
1
-1
0

样例解释
时刻 1,第 1 个任务被分配到第 1 台计算机,耗时为 5,这个任务时刻 6 会结束,占用计算机 1 的算力 3。
时刻 2,第 2 个任务需要的算力不足,所以分配失败了。
时刻 3,第 1 个计算机仍然正在计算第 1 个任务,剩余算力不足 3,所以失败。
时刻 4,第 1 个计算机仍然正在计算第 1 个任务,但剩余算力足够,分配后剩余算力 1。
时刻 5,第 1 个计算机仍然正在计算第 1,4 个任务,剩余算力不足 4,失败。
时刻 6,第 1 个计算机仍然正在计算第 4 个任务,剩余算力足够,且恰好用完。

思路:

对每个计算机维护一个堆,堆中存每一个任务对应的<任务结束时刻,消耗的算力>,
当在ai时刻分配任务d,则把堆中任务结束时刻小于ai的全部弹出\\恢复算力,
然后加入当前任务d(要判断能否加入)即可.

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
// PII <结束时刻,算力>
const int N=210000;
int s[N];
int main()

    int n,m;
    cin>>n>>m;
    priority_queue<PII,vector<PII>,greater<PII> >q[N];
    for(int i=1;i<=n;i++) cin>>s[i];
    while(m--)
    
        int a,b,c,d;//起始时刻,计算机编号,耗时,消耗算力
        cin>>a>>b>>c>>d;
        while(q[b].size()&&q[b].top().first<=a)
        
            //当堆尾的结束时刻小于当前分配时刻
            s[b]+=q[b].top().second; //恢复算力
            q[b].pop(); //弹出该任务
        
        if(s[b]<d) cout<<-1<<endl; // 不够
        else
        
            q[b].push(a+c,d); //将该任务加入
            s[b]-=d; //更新剩余算力
            cout<<s[b]<<endl;
        
    
    return 0;

如果觉得写的还不错,点个赞吧 ^ v ^

以上是关于第十二届蓝桥杯省赛第二场C++B组 真题题解(详细讲解+代码分析)看这篇就够了~~~的主要内容,如果未能解决你的问题,请参考以下文章

第十二届蓝桥杯省赛第二场C++B组真题

第十二届蓝桥杯省赛第一场C++ A/B/C组 真题题解(详细讲解 + 代码分析)看这篇就够了~~~~

第十二届蓝桥杯省赛第二场 C/C++ B组 编程题与详解

第十二届蓝桥杯省赛第一场C/C++ B组真题及部分题解

第十二届蓝桥杯省赛第二场C++A/B组 AcWing 3492. 负载均衡树状数组/堆

2021.5.9 第十二届蓝桥杯大赛软件赛省赛第二场大学B组(个人题解)