2021年第十二届蓝桥杯省赛第一场B组题解(自己写的)

第一题:

2021年第十二届蓝桥杯省赛第一场B组题解(自己写的)_第1张图片

 解题思路:


考查计算机的基础知识,1m=1024kb,1kb=1024b,b是字节的单位,1字节=8位。32位即为4个字节。

相关代码:

#include
using namespace std;
int main(){
    cout<<256*1024*1024/4;
    return 0;
}

第二题: 

2021年第十二届蓝桥杯省赛第一场B组题解(自己写的)_第2张图片

 解题思路:

没有什么思路,2021张减到0时,求这一过程。

相关代码:

#include
using namespace std;
int a[10];
int flag=0;
int main(){
    for(int i=0;i<10;i++){
        a[i]=2021;
    }
    for(int i=1;;i++){
        int temp=i;
        while(temp){
            if(a[temp%10]==0){
                flag=1;
                break;
            }
            a[temp%10]--;              
            temp=temp/10;
        }
        if(flag==1){
            cout<

第三题:

 2021年第十二届蓝桥杯省赛第一场B组题解(自己写的)_第3张图片

解题思路:

我是用斜率做的,但是,可能会有一点差错,毕竟是除法。

相关代码:

#include 
#include 
#include 
#include 
using namespace std;
int n;
typedef struct pair {
	double k;
	double b;
}PII;
bool cmp(PII p1,PII p2){
	return 	p2.k > p1.k;
}
vector l;
int main()
{
    for (int x1 = 0; x1 < 20; x1 ++ )
        for (int y1 = 0; y1 < 21; y1 ++ )
            for (int x2 = 0; x2 < 20; x2 ++ )
                for (int y2 = 0; y2 < 21; y2 ++ )
                    if (x1 != x2)
                    {
                        double k = (double)(y2 - y1) / (x2 - x1);
                        double b = y1 - k * x1;
                        l.push_back({k,b});
                    }

    sort(l.begin(), l.end(),cmp);
    int res = 1;
    for (int i = 1; i < l.size(); i ++ )
        if (fabs(l[i].k - l[i - 1].k) > 1e-8 || fabs(l[i].b - l[i - 1].b) > 1e-8)
            res ++ ;
    cout << res + 20 << endl;
    return 0;
}

第四题:

2021年第十二届蓝桥杯省赛第一场B组题解(自己写的)_第4张图片

解题思路:

求出n的所有的约数。。然后三重循环,注意:求约数的时候应该稍微地减少时间的复杂度。

相关代码:

#include
#include
#include
using namespace std;
long long n=2021041820210418;
vector a;
int cnt;
int main(){

    //首先求出n的所有的约数
    for(int i=1;i<=sqrt(n);i++){
        if(n%i==0){
            a.push_back(i);
        }
        if(n%i==0&&n/i!=i)
        a.push_back(n/i);
    }
    for(int i=0;i

第五题:

由于涉及到图论的知识,我目前还没有复习。

第六题:

2021年第十二届蓝桥杯省赛第一场B组题解(自己写的)_第5张图片

  

解题思路:

有手就行,没什么思路,注意:%02d表示的是如果少于两位则用零来补充。

相关思路:

#include
#include
#include
using namespace std;
long long ms;
long long h,m,s;
int main(){
    cin>>ms;
    s=ms/1000;
    s=s%(24*3600);
    h=s/3600;
    m=(s-h*3600)/60;
    s=s-h*3600-m*60;
    printf("%02d:%02d:%02d\n",h,m,s);
    return 0;
}

第七题:

2021年第十二届蓝桥杯省赛第一场B组题解(自己写的)_第6张图片

 解题思路:

dp,dfs,如果实在是不会,就跳过吧。

相关代码1:

#include
using namespace std;
int n;
int a[100001];
bool st[100001];
int res;
void dfs(int u,int sum){
    if(u==n){
        if(sum>0&&st[sum]!=true){
            res++;
            st[sum]=true;
        }    
        return;
    }
    dfs(u+1,sum);  //不选
    dfs(u+1,sum+a[u]);    
    dfs(u+1,sum-a[u]);
}
int main(){
    cin>>n;
    for(int i=0;i>a[i];
    }
    dfs(0,0);
    cout<

相关代码2(dp法):

2021年第十二届蓝桥杯省赛第一场B组题解(自己写的)_第7张图片

#include
using namespace std;
int f[110][100001];
int n;
int w;
int nums[110];
int res;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>nums[i];
        w+=nums[i];
    }
    f[0][0]=1;   //刚开始什么都没选表示只有一种方案。
    for(int i=1;i<=n;i++){
        for(int j=0;j<=w;j++){
          
            f[i][j]=f[i-1][j]||f[i-1][j+nums[i]]||f[i-1][abs(j-nums[i])];   //三者只要有一个存在,则f[i][j]存在。
            
        }
    }
    for(int i=1;i<=w;i++){
        if(f[n][i]!=0){
            res++;
        }
    }
    cout<

第八题:

2021年第十二届蓝桥杯省赛第一场B组题解(自己写的)_第8张图片

解题思路:

比赛的时候优先使用打表法,可以骗走一半的分,第二种方法比较难想。

相关代码1:

#include
using namespace std;
int a[1001][1001];
int n;
int res;
int flag=0;
int main(){
    scanf("%d",&n);
    for(int i=0;i<1001;i++){
        a[i][i]=1;
        a[i][0]=1;
    }
    for(int i=1;i<1001;i++){
        for(int j=1;j<=i;j++){
            a[i][j]=a[i-1][j]+a[i-1][j-1];
        }
    }
    for(int i=0;i<1001;i++){
        for(int j=0;j<=i;j++){
            res++;
            if(a[i][j]==n){
                cout<

相关代码2:

#include 

using namespace std;

const int N = 1000;
typedef long long LL;

LL n, r, c;

long long C(int a,int b){
    long long res=1;
    for(int i=a-b+1,j=1;i<=a&&j<=b;i++,j++){
        res=res*i/j;
    }
    return res;
}

bool check(long long k){
    long long  l = 2 * k, r = n;
    while(l < r){
        int mid = (l + r) >> 1;
        if(n <= C(mid, k)) r = mid;
        else l = mid + 1;
    }
    if(C(l, k) == n){
        cout<> n;
    if(n==1){
        cout<<1;
    }
    for(int i = 16; i >= 1; i--)
        if(check(i)) 
            break;

    return 0;
}

第九题:

2021年第十二届蓝桥杯省赛第一场B组题解(自己写的)_第9张图片

解题思路:

直接用sort()方法来骗分。 

相关代码:

#include
#include
using namespace std;
int n,m;
int a[100001];
int p,q;
bool cmp(int x,int y){
    return x>y;
}
int main(){
    cin>>n>>m;
    for(int i=0;i>p>>q;
        if(p==1){
            sort(a+q-1,a+n);
        }
        else{
            sort(a,a+q,cmp);
        }
    }
    for(int i=0;i

第十题:

不会做。。好难。。

你可能感兴趣的:(算法,蓝桥杯)