C/C++教程

第十二届蓝桥杯B组C/C++省赛

本文主要是介绍第十二届蓝桥杯B组C/C++省赛,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

A题.空间

在这里插入图片描述
就很坑,比赛是把int型当4bit了,其实它是4字节(B)

答案:67108864

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
    long long int m=256;
    m=m*1024*1024/4;
    printf("%lld",m);
    return 0;
}

B题.卡片

在这里插入图片描述
暴力就完事了!!!,不过要确保凑数字1时,那个1用了

答案:3181

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
int f[15];
int main()
{
    for(int i=0;i<10;i++)
        f[i]=2021;
    int x=0,flag=1;
    while(1)
    {
        int k=x+1;
        while(k)
        {
            int s=k%10;
            if(f[s])
            {
                f[s]--;
                k/=10;
            }
            else
            {
                flag=0;
                break;
            }
        }
        if(flag)
            x++;
        else
            break;
    }
    printf("%d",x);
    return 0;
}

C.直线

在这里插入图片描述
用集合去去重,每次向集合中传入当前直线的斜率和截距。

*注:当斜率不存在时,即直线平行于y轴,特殊处理,这里斜率用无穷大表示,截距取x坐标。

答案:48953

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cmath>
#include <algorithm>
#include <set>
using namespace std;
#define inf 0x3f3f3f3f
int main()
{
    double i,j,k,o;
    set<pair<double,double> > s;
    for(i=0;i<20;i++)
    {
        for(j=0;j<21;j++)
        {
            for(k=0;k<20;k++)
            {
                for(o=0;o<21;o++)
                {
                    double fz=o-j;
                    double fm=k-i;
                    if(fm==0)
                        s.insert(make_pair(inf,i));
                    else
                    {
                        double x=fz*1.0/fm;
                        double b=j-x*i;
                        s.insert(make_pair(x,b));
                    }
                }
            }
        }
    }
    printf("%d",s.size());
    return 0;
}

D.货物摆放

在这里插入图片描述
如果直接三层for循环,肯定很长时间,所以可以先找到n=2021041820210418的所有因子,然后在暴力找。

答案:2430

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cmath>
#include <algorithm>
#include <set>
using namespace std;
long long int a[1000000];
int main()
{
    long long int n=2021041820210418,i,j,k,l=0;
    set<pair<long long int,long long int> > s;
    for(i=1;i<=sqrt(n);i++)
        if(n%i==0)
            a[l++]=i;
    k=l;
    for(i=0;i<k;i++)
        a[l++]=n/a[i];
    for(i=0;i<l;i++)
    {
        for(j=0;j<l;j++)
        {
            for(k=0;k<l;k++)
            {
                if(a[i]*a[j]*a[k]==n)
                {
                    s.insert(make_pair(a[i],a[j]));
                }
            }
        }
    }
    printf("%lld",s.size());
    return 0;
}

E.路径

在这里插入图片描述
先创造距离,然后最短路算法,结果…听人家的感觉自己错了┭┮﹏┭┮…(希望路过的大佬可以指正

答案:804804086

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cmath>
#include <algorithm>
#include <set>
using namespace std;
int n,dis[2050][2050],flag[2050],d[2050];
void djiesitela(int v)
{
    long long int sum=0;
    for(int i=1;i<=n;i++)
    {
        d[i]=dis[v][i];
    }
    flag[v]=1;
    for(int i=1;i<n;i++)
    {
        int pos,minn=INT_MAX;
        for(int j=1;j<=n;j++)
        {
            if(minn>d[j]&&!flag[j])
            {
                pos=j;
                minn=d[j];
            }
        }
        flag[pos]=1;
        sum+=minn;
        for(int j=1;j<=n;j++)
        {
            if(dis[pos][j]<d[j]&&!flag[j])
                d[j]=dis[pos][j];
        }
    }
    printf("%lld",sum);
}
int main()
{
    int i,j;
    n=2021;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(i==j)
                dis[i][j]=0;
            else
                dis[i][j]=INT_MAX;
        }
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(i==j)
                continue;
            if(abs(i-j)<=21)
            {
                dis[i][j]=dis[j][i]=i*j/__gcd(i,j);
            }
        }
    }
    djiesitela(1);
    return 0;
}

F.时间显示

在这里插入图片描述
在这里插入图片描述
其实年月日对时间显示一点影响都没有,只需要知道1s=1000ms,然后把毫秒转化成秒,最后通过取余确定时分秒。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cmath>
#include <algorithm>
#include <set>
using namespace std;
int y,m,d,h,f,mi;
int main()
{
    long long int n;
    scanf("%lld",&n);
    y=1970,m=1,d=1,h=0,f=0,mi=0;
    n/=1000;
    int S,F,M;
    mi=n%60;
    n-=mi;
    n/=60;
    f=n%60;
    n/=60;
    h=n%24;
    printf("%02d:%02d:%02d",h,f,mi);
    return 0;
}

G.砝码称重

在这里插入图片描述
在这里插入图片描述
通过队列加入来算,要注意的是砝码可以进行加减,加减后的重量相当于新的砝码加入队列。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
int flag[100010];
int main()
{
    int n,w[150],i,j,x,sum=0;
    scanf("%d",&n);
    queue<pair<int,int> > q;
    for(i=0;i<n;i++)
    {
        scanf("%d",&w[i]);
        q.push(make_pair(w[i],i));
    }
    while(!q.empty())
    {
        int z=q.front().first;
        int ii=q.front().second;
        if(!flag[z])
        {
            flag[z]=1;
            sum++;
        }
        q.pop();
        for(int i=ii+1;i<n;i++)
        {
            x=abs(w[i]-z);
            if(!flag[x])
            {
                sum++;
                flag[x]=1;
            }
            q.push(make_pair(x,i));
        }
        for(int i=ii+1;i<n;i++)
        {
            x=z+w[i];
            if(!flag[x])
            {
                sum++;
                flag[x]=1;
            }
            q.push(make_pair(x,i));
        }
    }
    printf("%d",sum);
    return 0;
}

H.杨辉三角

在这里插入图片描述
在这里插入图片描述
说实话是真的狗,我推不出来规律,看到10^9数量级,我就知道,前20%吧,唯有暴力!!!o( ̄︶ ̄)o

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
int a[10000][10000];
int main()
{
    int n,i,j,s,flag=1;
    scanf("%d",&n);
    if(n==1)
       printf("1");
    else
    {
        a[0][0]=1;
        a[1][0]=1;
        a[1][1]=1;
        s=3;
        for(i=2;;i++)
        {
            for(j=0;j<=i;j++)
            {
                if(j==0||j==i)
                {
                    a[i][j]=1;
                    s++;
                }
                else
                {
                    a[i][j]=a[i-1][j-1]+a[i-1][j];
                    s++;
                    if(a[i][j]==n)
                    {
                        printf("%d",s);
                        flag=0;
                        break;
                    }
                }
            }
            if(!flag)
                break;
        }
    }
    return 0;
}

I.双向排序

在这里插入图片描述
在这里插入图片描述
前边心态已经搞炸了,时间也不够了,就直接用最直接的方法吧,sort排序呗!!w(゚Д゚)w 后边的过多少自求多福。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int s[100005],n,m,a,b,i;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
        s[i]=i+1;
    for(i=0;i<m;i++)
    {
        scanf("%d%d",&a,&b);
        if(a==0)
            sort(s,s+b,cmp);
        else
            sort(s+b-1,s+n);
    }
    for(i=0;i<n;i++)
    {
        printf("%d",s[i]);
        if(i!=n-1)
            printf(" ");
    }
    return 0;
}

J.括号序列

在这里插入图片描述
写完代码后自己的样例把自己推翻了(⊙o⊙)…也是真的绝了!!

如有不足,望评论区指正,Thanks♪(・ω・)ノ

这篇关于第十二届蓝桥杯B组C/C++省赛的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!