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;
}*/

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_渣渣辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值