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++个人记录的主要内容,如果未能解决你的问题,请参考以下文章