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组正式赛题解的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯省赛C++组别大学B组历年题解

蓝桥杯省赛C++组别大学B组历年题解

蓝桥杯省赛C++组别大学B组历年题解

2021第十二届蓝桥杯省赛JAVA B组 题目+答案(复现赛)

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

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