第十二届蓝桥杯省赛第二场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++ A/B/C组 真题题解(详细讲解 + 代码分析)看这篇就够了~~~~