2021第十二届蓝桥杯省赛C/C++大学B组正式赛题解
Posted Mr_渣渣辉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021第十二届蓝桥杯省赛C/C++大学B组正式赛题解相关的知识,希望对你有一定的参考价值。
A题
/*1mb = 1024kb
1kb = 1024b
1b = 8位二进制数
32位二进制数 = 4b
256*1024*1024/4 = 67108864*/
B题
//3181
#include <iostream>
using namespace std;
int main()
int ans ;
int book[10];
for(int i=0;i<10;i++)
book[i]=2021;
for(ans = 1; ; ans++)
//cout<<ans<<endl;
int temp = ans;
int check[10];
for(int j=0;j<10;j++)check[j]=0;
while(temp!=0)
check[temp%10]++;
temp/=10;
int flog = 0;
for(int i=0;i<10;i++)
if(check[i]>book[i])
flog=1;
break;
if(flog==0)
for(int i=0;i<10;i++)
book[i]-=check[i];
else
break;
cout<<ans-1<<endl;
return 0;
C题
//错的
//2376
#include <iostream>
using namespace std;
int main()
int ans = 20+20+20*19+20*19;//横竖斜
int b = 0;
//单点左斜边
for(int i=20;i>=3;i--)
b+=i;
//单点右斜边
int c = 0;
for(int i=19;i>=3;i--)
c+=i;
ans+=(b+c)*4;
cout<<ans<<endl;
return 0;
D题
//2430
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn=1e4+5;
ll ys[maxn];
int k=0;
void init(ll n)
for(ll i=1;i*i<=n;i++)
if(n%i==0)
if(i==n/i)
ys[k++]=i;
else
ys[k++]=i;
ys[k++]=n/i;
int main()
ll a ;//=2021041820210418;
while(cin>>a)
init(a);
sort(ys,ys+k);
int ans=0;
for(int i=0;i<k;i++)
for(int j=0;j<k;j++)
if(ys[i]*ys[j]>a)
break;
for(int p=0;p<k;p++)
if(ys[i]*ys[j]*ys[p]==a)
cout<<ys[i]<<" "<<ys[j]<<" "<<ys[p]<<endl;
ans++;
cout<<ans<<endl;
return 0;
E题
//10266837
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 1e3*3;
const int INF=0x7ffffff;
int mp[maxn][maxn];
int gcd(int a,int b)
return a%b==0?b:gcd(b,a%b);
int lcm(int a,int b)
return a/gcd(a,b)*b;
void init()
for(int i=1;i<=2021;i++)
for(int j=i+1;j<=2021;j++)
if(j-i<=21)
mp[i][j]=mp[j][i]=lcm(i,j);
else
mp[i][j]=mp[j][i]=INF;
int Dijestl()
int ans = INF;
for(int k=1;k<=2021;k++)
for(int i=1;i<=2021;i++)
for(int j=1;j<=2021;j++)
mp[i][j]=min(mp[i][k]+mp[k][j],mp[i][j]);
return ans;
int main()
init();//建图
cout<<Dijestl()<<endl;//最短路
return 0;
F题
#include <iostream>
using namespace std;
#define ll long long
int main()
ll ms;
cin>>ms;
ms/=1000;//秒
ll s =ms%60;
ms/=60;//分
ll m=ms%60;
ms/=60;//时
ll h=ms%24;
if(h<10)
cout<<0<<h;
else
cout<<h;
cout<<":";
if(m<10)
cout<<0<<m;
else
cout<<m;
cout<<":";
if(s<10)
cout<<0<<s;
else
cout<<s;
cout<<endl;
return 0;
G题
#include <iostream>
#include <map>
using namespace std;
int n;
const int maxn = 105;
int a[105];
#define ll long long
map<ll,int>mp;
ll ans;
void dfs(int m,int t,ll v)
if(m>n-1)
return ;
v=abs(v);
if(mp[v]==0)
ans++;
mp[v]=1;
for(int i=t+1;i<n;i++)
dfs(m+1,i,v+a[i]);
dfs(m+1,i,v-a[i]);
int main()
while(cin>>n)
ans=0;
mp.clear();
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
dfs(0,i,a[i]);
cout<<ans<<endl;
H题
//水数据
#include <iostream>
using namespace std;
const int maxn=1e4+5;
#define ll long long
ll a[maxn][maxn];
ll b[maxn*maxn];
void init()
a[1][1]=1;
for(int i=1;i<maxn;i++)//打印1000行
for(int j=1;j<=i;j++)
if(j==1||j==i)
a[i][j]=1;
else
a[i][j]=a[i-1][j-1]+a[i-1][j];
ll k=1;
for(int i=1;i<maxn;i++)
for(int j=1;j<=i;j++)
b[k++]=a[i][j];
//cout<<k<<endl;
int main()
init();
int N;
while(cin>>N)
// cout<<b[N]<<endl;
ll ans=1;
for(int i=1;i<maxn;i++)
if(b[i]==N)
break;
ans++;
cout<<ans<<endl;
return 0;
I题
//水数据
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
void init(int n)
for(int i=1;i<=n;i++)
a[i]=i;
bool cmp1(int a,int b)
return a<b;
bool cmp2(int a,int b)
return a>b;
int main()
int n,m;
while(cin>>n>>m)
init(n);
int p,q;
while(m--)
scanf("%d %d",&p,&q);
if(p)//升序
sort(a+q,a+n+1,cmp1);
else//降序
sort(a+1,a+q+1,cmp2);
for(int i=1;i<n;i++)
cout<<a[i]<<" ";
cout<<a[n]<<endl;
return 0;
J题
//错的
#include <iostream>
#include <string>
using namespace std;
int main()
string s;
while(cin>>s)
int left=0,right=0;
for(int i=0;i<s.length();i++)
if(s[i]=='(')
left++;
else
right++;
int ans=abs(right-left);
if(ans==0)
cout<<0<<endl;
else
cout<<2*ans+1<<endl;
return 0;
*/
以上是关于2021第十二届蓝桥杯省赛C/C++大学B组正式赛题解的主要内容,如果未能解决你的问题,请参考以下文章
2021第十二届蓝桥杯省赛JAVA B组 题目+答案(复现赛)