2021 第十二届蓝桥杯大赛软件赛决赛, 国赛,C/C++ 大学B 组

简介: 2021 第十二届蓝桥杯大赛软件赛决赛, 国赛,C/C++ 大学B 组

概览


答案提交:01-04
直接做就行
树不太确定,不过感觉是完全二叉树,贪了一个

程序设计:06-10
两个15分题,大小写是送的。123开始暴力,后来想到的前缀和优化,再后来想到了O(1)找到区块
两个20分题,异或变换是送的,很容易想到前8个是重复的。二进制n,k发现是个组合数了,但是打不出来交了暴力
两个25分题,括号序列感觉是个01线段树,但是没时间写了。最后一题没什么想法,都交了暴力。


1:25
2:1903

//T2
#include<bits/stdc++.h>
using namespace std;
int isprime(int x){
    if(x==1)return 0;
    for(int i = 2; i*i <= x; i++){
        if(x%i==0){
            return 0;
        }
    }
    return 1;
}
set<int>se;
int check(int x){
    int t = x;
    while(t){
        int r = t%10;
        if(!se.count(r))return 0;
        t = t/10;
    }
    return 1;
}
int main(){
    se.insert(2);
    se.insert(3);
    se.insert(5);
    se.insert(7);
    int cnt = 0;
    for(int i = 1; i <= 20210605; i++){
        if(isprime(i)){
            if(check(i)){
                cnt++;
            }
        }
    }
    cout<<cnt<<"\n";
    return 0;
}

3:977

//T3
#include<bits/stdc++.h>
using namespace std;
int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
    int cnt = 0;
    for(int y = 2001; y <= 2021; y++){
        if((y%100!=0&&y%4==0)||y%400==0){
            days[2] = 29;
        }else{
            days[2] = 28;
        }
        for(int m = 1; m <= 12; m++){
            for(int d = 1; d <= days[m]; d++){
                int s = 0;
                int yy=y, mm=m,dd=d;
                while(yy){s+=yy%10; yy/=10;}
                while(mm){s+=mm%10; mm/=10;}
                while(dd){s+=dd%10; dd/=10;}
                int q = (int)sqrt(s);
                if(q*q==s){
                    cnt++;
                }
            }
        }
    }
    cout<<cnt<<"\n";
    return 0;
}

4:2650578014

//T4
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define lch p<<1
#define rch p<<1|1

const int maxn = 1e4+10;
LL w[maxn], c[maxn], ok=0;
void build(int p, int l, int r){
    ok++;
    if(l==r){
        c[p] = 1;
        w[p] = 0;
        return ;
    }
    
    int mid = l+r>>1;
    build(lch,l,mid);
    build(rch,mid+1,r);
    
    c[p] = c[lch]+c[rch]+1;
    w[p] = 1+2*w[lch]+3*w[rch]+c[lch]*c[lch]*c[rch];
}
int main(){
    build(1,1,1011);
    cout<<w[1]<<"\n";
    cout<<ok<<"\n";
    return 0;
}

T5,大小写 ,15分

//T5
#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;  cin>>s;
    for(int i = 0; i < s.size(); i++)
        if(islower(s[i]))s[i] = toupper(s[i]);
    cout<<s;
    return 0;
}

T6, 123, 15分

//baoli v3
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e6+10;

LL num[maxn], ss[maxn];

LL sum(LL x){
    LL xx = x;
    while(xx>0){
        LL t = (LL)sqrt(xx*2);
        if(t*(t+1)==xx*2){
            break;
        }
        xx--;
    }
    
    LL t = sqrt(xx*2);
    LL ans = (1+x-xx)*(x-xx)/2;
    
    ans += ss[t];
    return ans;
    /*
    for(int i = t; i >= 1; i--){
        ans += i*(t-i+1);
    }
    return ans;
    */
}


int main(){
    for(int i = 1; i < maxn; i++){
        num[i] = num[i-1]+1;
        ss[i] = ss[i-1]+(1+i)*i/2;
    }
    
    int T;  cin>>T;
    while(T--){
        LL l, r;  cin>>l>>r;
        cout<<sum(r)-sum(l-1)<<"\n";
    }
    return 0;
}
//baoli15
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e7+10;
LL s[maxn];
int main(){
    LL now = 1, cur = 1;
    for(int i = 1; i <= maxn; i++){
        s[i] = s[i-1]+now;
        now++;
        if(now>cur){
            cur = now;
            now = 1;
        }
    }
    int T;  cin>>T;
    while(T--){
        int l, r;  cin>>l>>r;
        cout<<s[r]-s[l-1]<<"\n";
    }
    return 0;
}

T7,异或变换,20分

//T7
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
string c[10];
int main(){
    LL n, t;  cin>>n>>t;
    string a;  cin>>a;
    for(int k = 1; k <= 8; k++){
        string b = a;
        for(int i = 1; i < n; i++){
            b[i] = (a[i-1]-'0')^(a[i]-'0')+'0';
        }
        a = b;
        //cout<<k<<": "<<b<<"\n";
        c[k] = b;
    }
    t = t%8;
    if(t==0)t = 8;
    cout<<c[t]<<"\n";
    return 0;
}

T8,二进制问题 , 20分

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
    LL n, k;  cin>>n>>k;
    int cnt = 0;
    for(LL i = 1; i <= n; i++){
        LL x = i, t = 0;
        while(x){ t+=x&1; x>>=1;}
        if(t==k)cnt++;
    }
    cout<<cnt<<"\n";
    return 0;
}

T9,括号序列,25分

//baoli_25
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
    int n, m;  cin>>n>>m;
    string s;  cin>>s; s = "0"+s;
    while(m--){
        int op;  cin>>op;
        if(op==1){
            int l,r ; cin>>l>>r;
            for(int i = l; i <= r; i++){
                if(s[i]=='(')s[i]=')';
                if(s[i]==')')s[i]='(';
            }
            //cout<<s<<"\n";
        }else{
            int l;  cin>>l;
            int zuo = 0, you = 0, ans = 0;
            for(int i = l; i <= n; i++){
                if(s[i]=='(')zuo++;
                if(s[i]==')')you++;
                if(you>zuo){
                    break;
                }
                if(you==zuo){
                    ans = i;
                }
            }
            cout<<ans<<"\n";
        }
    }
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL C(LL n, LL m){
    LL ans = 1;
    for(LL i = m+1; i <= n; i++){
        ans *= i;
    }
    for(LL i = n-m; i >= 1; i--){
        ans /= i;
    }
    return ans;
}
int main(){
    LL n, k;  cin>>n>>k;
    LL num = 0, pos = 1, pos2 = 0, nn = n;
    while(nn){
        if(nn&1==1){
            num++;
            pos = pos2;
        }
        pos2++;
        nn >>= 1;
    }
    cout<<pos<<" "<<num<<"\n";
    
    LL ans = 0, tmp = 0;
    for(int i = pos; i >= 1; i--){
        if(n&(1<<(pos-1))==0){
            ans += C(pos-1, k-tmp);
        }else{
            tmp++;
            ans += C(num-tmp,k-tmp);
        }
    }
    
    cout<<ans<<"\n";
    return 0;
}

T10, 异或三角,25分

//baoli_ed
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e7+10;
int main(){
    int T;  cin>>T;
    while(T--){
        LL n;  cin>>n;
        LL ans = 0;
        for(LL a = 1; a <= n; a++){
            for(LL b = 1; b <= n; b++){
                for(LL c = 1; c <= n; c++){
                    if(a+b>c&&b+c>a&&c+a>b){
                        if((a^b^c)==0)ans++;
                    }
                    if(c-b>=a)break;
                }
            }
        }
        cout<<ans<<"\n";
    }
    return 0;
}

试题A: 带宽

【问题描述】
小蓝家的网络带宽是200 Mbps,请问,使用小蓝家的网络理论上每秒钟最
多可以从网上下载多少MB 的内容。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

试题B: 纯质数

本题总分:5 分
【问题描述】
如果一个正整数只有1 和它本身两个约数,则称为一个质数(又称素数)。
前几个质数是:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, · · · 。
如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如:2,
3, 5, 7, 23, 37 都是纯质数,而11, 13, 17, 19, 29, 31 不是纯质数。当然1, 4, 35
也不是纯质数。
请问,在1 到20210605 中,有多少个纯质数?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
试题

试题C: 完全日期

本题总分:10 分
【问题描述】
如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日
期。
例如:2021 年6 月5 日的各位数字之和为2 + 0 + 2 + 1 + 6 + 5 = 16,而
16 是一个完全平方数,它是4 的平方。所以2021 年6 月5 日是一个完全日期。
例如:2021 年6 月23 日的各位数字之和为2 + 0 + 2 + 1 + 6 + 2 + 3 = 16,
是一个完全平方数。所以2021 年6 月23 日也是一个完全日期。
请问,从2001 年1 月1 日到2021 年12 月31 日中,一共有多少个完全日
期?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

试题D: 最小权值

本题总分:10 分
【问题描述】
对于一棵有根二叉树T,小蓝定义这棵树中结点的权值W(T) 如下:
空子树的权值为0。
如果一个结点v 有左子树L, 右子树R,分别有C(L) 和C(R) 个结点,则
W(v) = 1 + 2W(L) + 3W(R) + (C(L))2 C(R)。
树的权值定义为树的根结点的权值。
小蓝想知道,对于一棵有2021 个结点的二叉树,树的权值最小可能是多
少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

试题E: 大写

时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母
转换成大写字母后将字符串输出。
【输入格式】
输入一行包含一个字符串。
【输出格式】
输出转换成大写后的字符串。
【样例输入1】
LanQiao
【样例输出1】
LANQIAO
【评测用例规模与约定】
对于所有评测用例,字符串的长度不超过100。

试题F: 123

时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
小蓝发现了一个有趣的数列,这个数列的前几项如下:
1, 1, 2, 1, 2, 3, 1, 2, 3, 4, ...
小蓝发现,这个数列前1 项是整数1,接下来2 项是整数1 至2,接下来
3 项是整数1 至3,接下来4 项是整数1 至4,依次类推。
小蓝想知道,这个数列中,连续一段的和是多少。
【输入格式】
输入的第一行包含一个整数T,表示询问的个数。
接下来T 行,每行包含一组询问,其中第i 行包含两个整数li 和ri,表示
询问数列中第li 个数到第ri 个数的和。
【输出格式】
输出T 行,每行包含一个整数表示对应询问的答案。
【样例输入】
31
1
1 3
5 8
【样例输出】
148
【评测用例规模与约定】
对于10% 的评测用例,1 ≤ T ≤ 30, 1 ≤ li ≤ ri ≤ 100。
对于20% 的评测用例,1 ≤ T ≤ 100, 1 ≤ li ≤ ri ≤ 1000。
对于40% 的评测用例,1 ≤ T ≤ 1000, 1 ≤ li ≤ ri ≤ 106。
对于70% 的评测用例,1 ≤ T ≤ 10000, 1 ≤ li ≤ ri ≤ 109。
对于80% 的评测用例,1 ≤ T ≤ 1000, 1 ≤ li ≤ ri ≤ 1012。
对于90% 的评测用例,1 ≤ T ≤ 10000, 1 ≤ li ≤ ri ≤ 1012。
对于所有评测用例,1 ≤ T ≤ 100000, 1 ≤ li ≤ ri ≤ 1012。
试题

试题G: 异或变换

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
小蓝有一个01 串s = s1s2s3 · · · sn。
以后每个时刻,小蓝要对这个01 串进行一次变换。每次变换的规则相同。
对于01 串s = s1s2s3 · · · sn,变换后的01 串s′ = s′
1s′
2s′
3
· · · s′
n 为:
s′
1 = s1;
s′
i = si−1 ⊕ si。
其中a ⊕ b 表示两个二进制的异或,当a 和b 相同时结果为0,当a 和b
不同时结果为1。
请问,经过t 次变换后的01 串是什么?
【输入格式】
输入的第一行包含两个整数n, t,分别表示01 串的长度和变换的次数。
第二行包含一个长度为n 的01 串。
【输出格式】
输出一行包含一个01 串,为变换后的串。
【样例输入】
5 3
10110
【样例输出】
11010
试【样例说明】
初始时为10110,变换1 次后变为11101,变换2 次后变为10011,变换3
次后变为11010。
【评测用例规模与约定】
对于40% 的评测用例,1 ≤ n ≤ 100, 1 ≤ t ≤ 1000。
对于80% 的评测用例,1 ≤ n ≤ 1000, 1 ≤ t ≤ 109。
对于所有评测用例,1 ≤ n ≤ 10000, 1 ≤ t ≤ 1018。

试题H: 二进制问题

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
小蓝最近在学习二进制。他想知道1 到N 中有多少个数满足其二进制表示
中恰好有K 个1。你能帮助他吗?
【输入格式】
输入一行包含两个整数N 和K。
【输出格式】
输出一个整数表示答案。
【样例输入】
7 2
【样例输出】
3
【评测用例规模与约定】
对于30% 的评测用例,1 ≤ N ≤ 106, 1 ≤ K ≤ 10。
对于60% 的评测用例,1 ≤ N ≤ 2 × 109, 1 ≤ K ≤ 30。
对于所有评测用例,1 ≤ N ≤ 1018, 1 ≤ K ≤ 50。

试题I: 翻转括号序列

时间限制: 2.0s 内存限制: 512.0MB 本题总分:25 分
【问题描述】
给定一个长度为n 的括号序列,要求支持两种操作:

  1. 将[Li; Ri] 区间内(序列中的第Li 个字符到第Ri 个字符)的括号全部翻

转(左括号变成右括号,右括号变成左括号)。

  1. 求出以Li 为左端点时,最长的合法括号序列对应的Ri (即找出最大的

Ri 使[Li; Ri] 是一个合法括号序列)。
【输入格式】
输入的第一行包含两个整数n;m,分别表示括号序列长度和操作次数。
第二行包含给定的括号序列,括号序列中只包含左括号和右括号。
接下来m 行,每行描述一个操作。如果该行为“1 Li Ri”,表示第一种操作,
区间为[Li; Ri] ;如果该行为“2 Li” 表示第二种操作,左端点为Li。
【输出格式】
对于每个第二种操作,输出一行,表示对应的Ri。如果不存在这样的Ri,
请输出0。
【样例输入】
7 5
((())()
2 3
2 2
1 3 5
2 3
2 1
试题I: 翻转括号序列12
【样例输出】
4700
【评测用例规模与约定】
对于20% 的评测用例,n;m ≤ 5000;
对于40% 的评测用例,n;m ≤ 30000;
对于60% 的评测用例,n;m ≤ 100000;
对于所有评测用例,1 ≤ n ≤ 106, 1 ≤ m ≤ 2 × 105。

目录
相关文章
|
3月前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置软件触发模式(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置软件触发模式(C++)
31 0
|
11天前
|
测试技术 C++
[蓝桥杯 2023 省 B] 冶炼金属(c++)
[蓝桥杯 2023 省 B] 冶炼金属(c++)
23 0
|
2月前
|
Java C++ Python
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-456 求链表各节点的平均值(C++解法)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-456 求链表各节点的平均值(C++解法)
29 0
|
2月前
|
Java 数据安全/隐私保护 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-193 Password Suspects(C++&Java)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-193 Password Suspects(C++&Java)
20 1
|
2月前
|
Java C++ Python
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-161 Abbott’s Revenge(C++写法)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-161 Abbott’s Revenge(C++写法)
125 42
|
2月前
|
人工智能 测试技术 C++
第十五届蓝桥杯模拟赛B组(第二期)C++
第十五届蓝桥杯模拟赛B组(第二期)C++
93 0
第十五届蓝桥杯模拟赛B组(第二期)C++
|
3月前
|
人工智能 测试技术 C++
蓝桥杯15届第二次模拟赛C/C++详解
蓝桥杯15届第二次模拟赛C/C++详解
103 0
|
3月前
|
C++
蓝桥杯15届第二次模拟C++
蓝桥杯15届第二次模拟C++
31 0
|
3月前
|
算法 测试技术 编译器
蓝桥杯-02-蓝桥杯C/C++组考点与14届真题
蓝桥杯-02-蓝桥杯C/C++组考点与14届真题
|
3月前
|
C++
第十三届蓝桥杯B组C++(试题C:刷题统计)
第十三届蓝桥杯B组C++(试题C:刷题统计)
20 0