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

Posted 小哈里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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) 如下:
空子树的权

以上是关于2021 第十二届蓝桥杯大赛软件赛决赛, 国赛,C/C++ 大学B 组的主要内容,如果未能解决你的问题,请参考以下文章

第十二届蓝桥杯大赛软件赛决赛题解

2021软件类第十二届蓝桥杯国赛真题 Python组 A-E题解

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

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

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

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