2021蓝桥杯国赛B组C/C++个人记录

Posted As_zyh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021蓝桥杯国赛B组C/C++个人记录相关的知识,希望对你有一定的参考价值。

以下为个人场上所提交答案,欢迎大家指出错误,后续会更正正确题解。




在这里插入图片描述

个人提交:25

说明: Mbps是M bit per second, MB是 M Byte,bit是比特,Byte是字节,1Byte=8bit, 200/8=25




在这里插入图片描述
个人提交:21844 (有误)
改正:1903

说明:只有每个位都为1、3、5、7之一才是题目所说的纯质数。还有一个条件当时没注意到,这个数本身也要是素数,应该先用埃氏筛法。

代码:

#include<cstdio>
#include<cstring>

const int MAX_N = 20210605;
int num[MAX_N + 1];
int sum = 0;

void solve(int x) {
	int isPrime = 1;
	while(x > 0) {
		int b = x%10; //b为x的个位数字
		if(!(b == 2 || b == 3 || b == 5 || b == 7)) {
			isPrime = 0;
			break;
		}
		x = x/10;
	}
	if(isPrime) sum++;
}

int main() {
	memset(num, 1, sizeof(num));
	for(int i = 2; i < 20210605; i++) {
		for(int j = 2; i*j <= 20210605; j++) {
			num[i*j] = 0;
		}
	}
	for(int i = 1; i <= 20210605; i++) {
		if(num[i]) solve(i);
	}
	printf("%d\\n", sum);
	return 0;
}






在这里插入图片描述个人提交:977

说明:现场写日期类太麻烦,直接用excel搞数据,然后用c处理

在这里插入图片描述
先在excel中敲入这两格内容,第三格做个差,看看一共有多少天
在这里插入图片描述
在这里插入图片描述
得7699,从A1格往下拉7669行,得到从2001/1/1到2021/12/31的每一天
在这里插入图片描述为了方便处理数据,把刚才不用的删掉,并且把表格另存为.csv文件

在这里插入图片描述数据有了,直接全选复制,接下来用c/c++处理

#include<cstdio>
#include<iostream>
#include<string>
using namespace std;

int res = 0;

void solve(int x) {
	for(int i = 0; i < 100; i++) {
		if(i * i == x) res++;
	}
}

int main() {
	string line;
	while(getline(cin, line)) {
		int len = line.length();
		int sum = 0;
		for(int i = 0; i < len; i++) {
			if(isdigit(line[i])) sum += line[i] - '0';
		}
		solve(sum);
		cout << res << endl;
	}
}

得出结果977





在这里插入图片描述个人提交:2667336761

说明:不会dp,赌了一把完全二叉树

#include<iostream>
using namespace std;

const int MAX_N = 2021; //结点个数,用完全二叉树的编号代表结点 

long long C(long long x) {
	if(x > MAX_N) return 0;
	return 1 + C(2*x) + C(2*x+1);
}

long long W(long long x) {
	if(x > MAX_N) return 0;
	return 1 + 2*W(2*x) + 3*W(2*x+1) + C(2*x)*C(2*x)*C(2*x+1);
}

int main() {
	cout << W(1) << endl;
	return 0;
}






在这里插入图片描述在这里插入图片描述
代码:

#include<cstdio>
#include<cstring>
#include<ctype.h>

char s[110];

int main() {
	scanf("%s", s);
	for(int i = 0; i < strlen(s); i++)
		printf("%c", toupper(s[i]));
	return 0;
}






在这里插入图片描述在这里插入图片描述在这里插入图片描述常规写法,过40%用例,评论区大佬说二分法,我在考场想到利用等差数列前n项和并根据R-L的值取分段函数,但是没来得及改,后期补上

#include<cstdio>

const int MAX_N = 200000000;
int a[MAX_N], sum = 0;

void solve() {
	int maxn = 1, n = 1;
	for(int i = 1; i < MAX_N; i++) {
		a[i] = n++;
		if(n > maxn) {
			maxn++;
			n=1;
		}
	}
}

int main() {
	solve();
	int T;
	scanf("%d", &T);
	for(int i = 0; i < T; i++) {
		int l, r;
		sum = 0;
		scanf("%d%d", &l, &r);
		for(int i = 0; l+i <= r; i++) {
			sum += a[l+i];
		}
		printf("%d\\n", sum);
	}
	return 0;
}






在这里插入图片描述在这里插入图片描述在这里插入图片描述没找到规律,硬写,过40%用例
评论区大佬说找循环节,后期补上

#include<cstdio>
#include<cstring>

const int MAX_N = 200000000;
char s[MAX_N];
char s2[MAX_N];
int n, t;

void reverse() {
	s2[0] = s[0];
	for(int i = 1; i < n; i++) {
		s2[i] = (s[i] - '0') ^ (s[i-1] - '0') + '0';
	}
	strncpy(s, s2, n);
}

int main() {
	scanf("%d%d", &n, &t);
	scanf("%s", s);
	for(int i = 0; i < t; i++) reverse();
	printf("%s", s);
	return 0;
}






在这里插入图片描述在这里插入图片描述不会dp,硬写过30%用例

#include<cstdio>
using namespace std;

int N, K, res = 0;

void solve(int x) {
	int sum = 0;
	while(x > 0) {
		if(x % 2 == 1) sum++;
		x = x/2;
	}
	if(sum == K) res++;
}

int main() {
	scanf("%d%d", &N, &K);
	for(int i = 1; i <= N; i++) solve(i);
	printf("%d\\n", res);
	return 0;
}






在这里插入图片描述在这里插入图片描述在这里插入图片描述简单的括号匹配(栈),不知道能过多少用例
评论区说线段树,后期补上

#include<cstdio>
#include<stack>
using namespace std;

const int MAX_N = 1000000+10;
int n, m, L, R;;
char s[MAX_N];

void rev() {
	for(int i = 0; L+i <= R; i++) {
		if(s[L+i] == '(') s[L+i] = ')';
		else s[L+i] = '(';
	}
}

int isLawful(int R) {
	stack<int> s1;
	for(int i = 0; L+i <= R; i++) {
		int ch = s[L+i];
		if(ch == '(') s1.push(ch);
		else if(!s1.empty() && ch==')' && s1.top() == '(') {
			s1.pop();
		} else {
			s1.push(ch);
		}
	}
	if(s1.empty()) return 1;
	else return 0;
}

void solve() {
	for(int i = n; i > L; i--) {
		if(isLawful(i))  {
			printf("%d\\n", i);
			return;
		}
	}
	printf("%d\\n", 0);
}

int main() {
	scanf("%d%d", &n, &m);
	scanf("%s", s+1); // 使索引和L、R一致 
	for(int i = 0; i < m; i++) {
		int k = 0;
		scanf("%d", &k);
		if(k == 1) {
			scanf("%d%d", &L, &R);
			rev();
		} else {
			scanf("%d", &L);
			solve();
		}
	}
	return 0;
}






在这里插入图片描述在这里插入图片描述在这里插入图片描述硬写,勉强过10%用例吧

考场上理解错了耗了一个多小时,还弄了个结构体,放到set里去重,然后运算符重载,最后发现根本不用,哈哈哈,以后还是应该先写个大概,看看样例输入输出,再往下做。

对了,异或运算符 ^ 优先级较低,记得加括号

#include<cstdio>
#include<algorithm>
using namespace std;

int T, n, res = 0;

void solve() {
	for(int a = 1; a <= n; a++) {
		for(int b = 1; b <= n; b++) {
			for(int c = 1; c <= min(n, a+b-1); c++) {
				if(a+b<=c || a+c<=b || b+c<=a) continue;
				if((a^b^c) == 0) res++;
			}
		}
	}
}

int main() {
	scanf("%d", &T);
	for(int i = 0; i < T; i++) {
		scanf("%d", &n);
		solve();
		printf("%d\\n", res);
	}
	return 0;
}

先写到这,我要去准备期末考试了~
考完继续更正

出了,菜鸡国三,明年再战~

以上是关于2021蓝桥杯国赛B组C/C++个人记录的主要内容,如果未能解决你的问题,请参考以下文章

2021第十二届蓝桥杯国赛C/C++大学B组题解

2021第十二届蓝桥杯国赛C/C++大学B组题解

2021第十二届蓝桥杯国赛C/C++大学B组题解

2021第十二届蓝桥杯国赛C/C++大学B组题解

第十二届蓝桥杯国赛B组 做题记录(python)

第十二届蓝桥杯国赛B组 做题记录(python)