前言
刚考完试现在可算有时间可以把这个坑填上了呜呜。
不过由于比赛时间距现在有一点长了,我无法保证跟当时完全一样,但是我能保证思路大体是一样的qwq。
然后代码下面的我大部分值测了样例,没有测试oj收录(也可能是我没有找到有这道题的OJ),我就只测试了样例。
下面的我也只打了我会做的。
填空题
A 带宽
反思
这道题这个转换其实我看了众多科技视频都会提到的,但我一直没有补充这个转换的知识,就变了一个数上去
题解
200 / 8 = 25
所以答案是25
B 纯质数
反思
其实这个题并不是多么难,而且代码实现也很简单
题解
题意很明显,按照题意模拟一下答案就出来了,但是如果不用线性筛的话,我初步估计要跑10min左右
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <sstream>
using namespace std;
int cnt_prime;
bool vis[20210605 + 10];
int primes[20200605 + 10];
void get_prime(){
vis[1] = 1;
vis[0] = 1;
for(int i = 2; i <= 20210605; i++){
if(!vis[i]){
primes[cnt_prime++] = i;
}
for(int j = 0; primes[j] <= 20210605 / i; j++){
vis[i * primes[j]] = 1;
if(i % primes[j] == 0) break;
}
}
}
int main(){
int ans = 0;
get_prime();
for(int i = 0; i < cnt_prime; i++){
stringstream ss;
ss << primes[i];
string s;
ss >> s;
int flag = 1;
// cout << s << endl;
for(int j = 0; j < s.size(); j++){
// cout << (int)(s[j] - '0') << endl;
if(vis[(int)(s[j] - '0')]){
flag = 0;
break;
}
}
if(flag)
ans ++;
}
cout << ans;
return 0;
}
C 完全日期
反思
这种题实际上蓝桥杯每年基本上都有的,套路也一样,不是构造日期而是判断数作为日期的合法性。这两者读者只要实验一下就知道明显后者更简单
题解
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <sstream>
using namespace std;
bool judge(int date){
int y = date / 10000;
int m = date / 100 % 100;
int d = date % 100;
int flag_run = 0;
if(y % 4 == 0){ // 判断闰年,这里面没有1000结尾的,所以不需要判断整除400的了
flag_run = 1;
}
if(m > 12 || m < 1){
return 0;
}
if(d > 31 || d < 1){
return 0;
}
if(m == 4 || m == 6 || m == 9 || m == 11){
if(d > 30){
return 0;
}
}
if(m == 2){
if(flag_run == 1){
if(d > 29){
return 0;
}
}
else{
if(d > 28){
return 0;
}
}
}
return 1;
}
int main(){
int ans = 0;
for(int i = 20010101; i <= 20211231; i++){
if(judge(i)){
stringstream ss;
ss << i;
string s;
ss >> s;
int summ = 0;
for (int j = 0; j < s.size(); j++){
summ += s[j] - '0';
}
int x = sqrt(summ);
if (x * x == summ){
ans++;
}
}
}
cout << ans;
return 0;
}
编程题
E 大写
反思
直接找桌面给的api,用ctype直接转
题解
#include <iostream>
#include <ctype.h>
#include <algorithm>
using namespace std;
int main(){
string s;
cin >> s;
for (int i = 0; i < s.size(); i++){
cout << (char)toupper(s[i]);
}
return 0;
}
F 123
反思
刚拿到这个题的时候,一看数据范围,懵了,这都到了 1 0 12 10^{12} 1012级别了,直接构造加前缀和肯定炸了。
直接先写暴力吧,当时想着能把全部题的暴力写出来就行了,全部写完再回来想正解
题解
如果直接前缀和的话,能开到10的7次方的数组大约差不多能构造完。
计算一下空间,在它给定的空间内尽可能的开大吧qwq。
大约能开三千万左右的ll吧,差不多可以拿到40分
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <sstream>
#define ll long long
#define re return
#define Endl "\n"
#define endl "\n"
using namespace std;
typedef pair<int, int> PII;
const int MAXN = 33554400;
int T;
ll s[MAXN];
void init(){
int cnt = 1;
int x = 1;
for(int i = 1; cnt <= MAXN - 10; i++){
s[cnt] = s[cnt - 1] + i;
if(x == i){
x ++;
i = 0;
}
cnt ++;
}
}
int main(){
init();
scanf("%d", &T);
while(T--){
int l, r;
scanf("%d%d", &l, &r);
printf("%lld\n", s[r] - s[l - 1]);
}
return 0;
}
G 异或变换
反思
没思路,直接暴力模拟
题解
H 二进制问题
反思
问1-N中有多少个数满足恰好有K个1,那么我们在N表示的二进制位数中,排列K个1之后直接判断是不是小于N即可
题解
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int nn;
int m;
int way[100];
int ans = 0;
void dfs(int u, int start, int n, int m){ // u是现在是看第几位,start是从哪个数开始枚举
if(u - 1 + n - start + 1 < m) //剪枝,后面加上所有的数不够m个就不用看了
return;
if(u == m + 1){
int x = 0;
for (int i = 1; i <= m; i++){
x = x + (1 << (way[i] - 1));
// cout << way[i] << " ";
}
if(x <= nn)
ans++;
// cout << x << endl;
return;
}
for (int i = start; i <= n; i++){
way[u] = i;
dfs(u + 1, i + 1, n, m); //注意此时的start变为i+1了!
way[u] = 0;
// vis[i] = false;
}
}
int main(){
cin >> nn >> m;
int cnt = 0;
int x = nn;
while(x){
x >>= 1;
cnt++;
}
dfs(1, 1, cnt, m);
cout << ans;
return 0;
}
I 翻转括号序列
正常括号模拟判断就可以了qwq