第二周总结
蓝桥杯模拟赛 2
总结:
本次模拟赛共有 8 道题, 4 道是入门题和 4 道普及题, 入门题都做对了, 但普及题都没做对。还是得学算法, 多做题。
模拟赛题解 (不全)
A: [蓝桥杯 2020 省 AB1] 解码
难度: 入门
题意:
写出缩写前的字符串。
思路:
数字一定在要重复写的字符的加 1 位置, 所以判断第 i + 1 个字符是否是数字, 若是将第 i 个字符输出对应的个数字并跳过数字字符, 否则只输出 1 次。
主要是考虑想 "a3aa", "a1aa" 等情况。
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
string s;
getline(cin, s);
for (int i = 0; i < s.length(); i++)
{
if ((s[i + 1] - '0') >= 1 && (s[i + 1] - '0') <= 9)
{
int n = s[i + 1] - '0';
while (n--)
{
cout << s[i];
}
i++;
}
else cout << s[i];
}
return 0;
}
B: [蓝桥杯 2020 省 AB2] 成绩分析
难度: 入门
题意:
输入数组元素, 按顺序输出最大值, 最小值和平均数。
代码:
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
int n = 0;
cin >> n;
vector<int> ve(n);
double sum = 0;
for (int i = 0; i < ve.size(); i++)
{
cin >> ve[i];
sum += ve[i];
}
std::sort(ve.begin(), ve.end()); // 升序排序
printf("%d\n", ve[n - 1]);
printf("%d\n", ve[0]);
printf("%.2lf", sum / n);
return 0;
}
C: [蓝桥杯 2020 省 B1] 整除序列
难度: 入门
题意:
输入一个数 n, 输出这个数的一种序列。
该序列的每一个数都是前一个除 2。
序列包括输入的数 n。
思路:
无
注: 注意 n 的取值范围。
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
long long n = 0;
cin >> n;
while (n)
{
cout << n << ' ';
n /= 2;
}
return 0;
}
D: [蓝桥杯 2020 省 AB3] 日期识别
难度: 入门
题意:
根据英文字符串日期输入, 输出日期的数字形式。
月份用月份的英文前三字母表示, 首字母大写, 如: 一月 --> "Jan"。
思路:
输入的字符串由 "mouth+day" 组成, 如: "Feb08", 所以只把月份转换成数字输出即可。
注:不输出个位数中的 0, 如: "Feb08" 输出是 2 8。
代码:
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
char * p[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
string s;
getline(cin, s);
for (int i = 0; i < 12; i++)
if (s[0] == *(p[i]) && s[1] == *(p[i] + 1) && s[2] == *(p[i] + 2))
{
cout << i + 1 << ' ';
break;
}
if (s[3] == '0') cout << s[4];
else cout << s[3] << s[4];
return 0;
}
E: [蓝桥杯 2020 省 AB2] 回文日期
难度: 普及
题意:
输入一个日期, 输出下一个回文日期和下一个 "ABABBABA" 形式的回文日期。
回文日期: 年份与月份和天数对称的日期, 如: 20200202, 20211202, 30100103 等等。
思路:
找到所有对称的日期, 保存并按升序排序。
通过 for 循环找到符合要求的日期并输出。
注:
输出的两个日期可能相同, 如: 输入 --> 20200201, 输出 --> 20200202 20200202。
因为月份和天数为 0229 的回文日期为 92200229, 9220 年是闰年, 所以不用考虑 2月是 28 天还是 29 天的问题。
代码:
#include <bits/stdc++.h>
using namespace std;
int n, p, q;
vector<int> ve1; // 记录回文日期
vector<int> ve2; // 记录 "ababbaba" 形式的日期
int s[13] = {0, 31, 29, 31, 30, 31, 30, 31, 30, 31, 31, 30, 31}; // 每个月份的最大天数
int main(void)
{
cin >> n;
for (int i = 1; i <= 12; i++)
{
for (int j = 1; j <= s[i]; j++)
{
int a = (j % 10) * 1000 + (j / 10) * 100 + (i % 10) * 10 + i / 10;
int sum = a * 10000 + i * 100 + j;
ve1.push_back(sum);
p++;
if (i == j)
{
ve2.push_back(sum);
q++;
}
}
}
std::sort(ve1.begin(), ve1.end());
std::sort(ve2.begin(), ve2.end());
for (int i = 0; i < p; i++)
{
if (ve1[i] <= n) continue;
else
{
cout << ve1[i] << endl;
break;
}
}
for (int i = 0; i < q; i++)
{
if (ve2[i] <= n) continue;
else
{
cout << ve2[i] << endl;
break;
}
}
return 0;
}
SMU Winter 2023 Round #3 (Div.2)
总结:
本次模拟赛共 11 道题, 共 7 道入门题, 3 道普及题, 一道提高题。入门题都做出来了, 并且无意间 D 题拿了一血, 还有要说的是一定要注意输出的格式 B 题的输出格式类似 1, 2, 3, ..., n, 有 ' , ', 我掉坑里了, 交了 4 次一直 AW。普及题还是不能 AC 或没有思路, 提高题完全没有思路。网上的答案也听不懂, 我觉得我得把重点放在算法基础上, 在 acwing 上系统学一下算法基础, 因为除了入门题, 普及和提高题大多数情况下都要用到算法甚至有些题就是算法模板题, 你不会算法就是不会。
模拟赛题解 (不全)
B : P8196 [传智杯 #4 决赛] 三元组
难度: 入门
题意:
给定一个长度为 n 的数列 a1, a2, ..., an , 有一个有序三元组 ( i, j, k ) , 满足 1 <= i <= j <= k <= n , 求出满足 ai + aj = ak 形式的三元组的个数。
思路:
将输入的数列按升序排序。
将数列中的两个数相加, 确保其中的一个数大于等于另一个数, 若数列中有相加后的数, 则满足传智三元组的条件, 计数器加一, 重复该操作, 直到找到所有满足条件的三元组。
注:注意输出格式。
代码:
#include <bits/stdc++.h>
using namespace std;
int t, arr[110];
int main(void)
{
cin >> t;
while (t--)
{
int n, ans;
cin >> n;
for (int i = 1; i <= n; i++) cin >> arr[i];
for (int i = 1; i <= n; i++)
for (int j = i; j <= n; j++)
for (int k = j; k <= n; k++)
if (arr[i] + arr[j] == arr[k])
ans ++;
cout << ans << endl;
}
return 0;
}
C: P8829 [传智杯 #3 练习赛] 单位转换
难度: 入门
题意:
给定一个值和单位, 转换为指定单位的值。
给定单位和指定单位都是 GB, MB, KB, B 中的一个。
用字符串输入。
思路:
用 vector
得到字符串中的数字, 然后给一个 int 类型赋值。 判断对应的给定单位和要转换的单位, 赋对应的值即可。
代码:
#include <bits/stdc++.h>
using namespace std;
string s;
double sum;
int main(void)
{
cin >> s;
vector<int> ve;
int k = 0;
for (int i = 0; i < s.size(); i++)
{
if ((s[i] - '0') >= 0 && (s[i] - '0') <= 9)
{
ve.push_back(s[i] - '0');
k ++;
}
else break;
}
int num = 0;
for (int i = 0; i < k; i++)
{
num = (num + ve[i]) * 10;
}
num /= 10;
if (s[k] == 'B')
{
for (int i = k + 2; i < s.size(); i++)
{
if (s[i] == 'B')
{
sum = num;
break;
}
else if (s[i] == 'K')
{
sum = num / pow(2, 10);
break;
}
else if (s[i] == 'M')
{
sum = num / pow(2, 20);
break;
}
else if (s[i] == 'G')
{
sum = num / pow(2, 30);
break;
}
}
}
if (s[k] == 'K')
{
for (int i = k + 2; i < s.size(); i++)
{
if (s[i] == 'B')
{
sum = num * pow(2, 10);
break;
}
else if (s[i] == 'K')
{
sum = num;
break;
}
else if (s[i] == 'M')
{
sum = num / pow(2, 10);
break;
}
else if (s[i] == 'G')
{
sum = num / pow(2, 20);
break;
}
}
}
if (s[k] == 'M')
{
for (int i = k + 2; i < s.size(); i++)
{
if (s[i] == 'B')
{
sum = num * pow(2, 20);
break;
}
else if (s[i] == 'K')
{
sum = num * pow(2, 10);
break;
}
else if (s[i] == 'M')
{
sum = num;
break;
}
else if (s[i] == 'G')
{
sum = num / pow(2, 10);
break;
}
}
}
if (s[k] == 'G')
{
for (int i = k + 2; i < s.size(); i++)
{
if (s[i] == 'B')
{
sum = num * pow(2, 30);
break;
}
else if (s[i] == 'K')
{
sum = num * pow(2, 20);
break;
}
else if (s[i] == 'M')
{
sum = num * pow(2, 10);
break;
}
else if (s[i] == 'G')
{
sum = num;
break;
}
}
}
cout << setiosflags(ios::fixed) << setprecision(6);
cout << sum;
return 0;
}
D: P8813 [CSP-J 2022] 乘方
难度: 入门
题意:
判断 a 的 b 次方是否大于 10 ^ 9, 若是输出 -1, 若不是输出值即可。
思路:
无
#include <bits/stdc++.h>
using namespace std;
int a, b;
long long sum = 1;
int main(void)
{
cin >> a >> b;
int flag = 0;
for (int i = 0; i < b; i++)
{
sum *= a;
if (sum > 1e9)
{
cout << "-1" << endl;
flag = 1;
break;
}
}
if (flag == 0) cout << sum << endl;
return 0;
}
F: P7066 [NWRRC2014]Grave
难度: 入门
题意:
给定三个长方形 A, B, C, 问当长方形 B 在 A 内时, A 剩余的空间是否能容下 C。
思路:
长方形 A 的面积大致可以分为 4 个部分, 分别判断这四个部分的面积能否容下 C 即可。
代码:
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
int x1, y1, x2, y2;
int x3, y3, x4, y4;
int a, b;
cin >> x1 >> y1 >> x2 >> y2;
cin >> x3 >> y3 >> x4 >> y4;
cin >> a >> b;
int h = y2 - y1;
int w = x2 - x1;
if (y2 - y4 >= b && w >= a) cout << "Yes" << endl;
else if (x3 - x1 >= a && h >= b) cout << "Yes" << endl;
else if (x2 - x4 >= a && h >= b) cout << "Yes" << endl;
else if (y3 - y1 >= b && w >= a) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}
G: P7018 [CERC2013] Bus
难度: 入门
题意:
公交车上有 最开始有 n 个人 , 现在每到一站先下来一人 , 后下来车里所有人的二分之一 , 每到一个站点以此类推 , 直到车里最后一个人下来位置 , 现在给总共停下的站点个数 , 求最开始车里的总人数。
思路:
从输入输出样例可以推出最后车里有 1 人 , 倒数第二站下来前是 3 人 , 可以推出 i = (i - 1) * 2 + 1 , 相加即可。
注: 注意最后一次的乘 2 要忽略。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int t;
int add(int n)
{
LL sum = 0;
while (n--)
{
sum++;
if (n != 0) sum *= 2;
}
return sum;
}
int main(void)
{
cin >> t;
while (t--)
{
int n = 0;
cin >> n;
cout << add(n) << endl;
}
return 0;
}
J: B2139 区间内的真素数
难度: 入门
题意:
找出一个范围内的所有真素数。
真素数: 若一个素数的反序数也是素数, 则这个数是真素数 , 如: 17 是真素数 , 因为 17 和 71 都是素数; 19 不是真素数 , 因为 19 是素数 , 但 91 不是素数。
思路:
找到素数 , 再证明素数的反序是否是素数即可。
**注: **注意输出格式 , 不要忘了如果范围内没有真素数输出 No。
代码:
#include <bits/stdc++.h>
using namespace std;
int m, n;
int main(void)
{
cin >> m >> n;
int flag1 = 0;
for (int i = m; i <= n; i++)
{
int flag2 = 0, flag3 = 0;
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
flag2 = 1;
break;
}
}
if (flag2 == 0)
{
int a = i, num = 0;
while (a)
{
num = (num + (a % 10)) * 10;
a /= 10;
}
num /= 10;
for (int j = 2; j < num; j++)
{
if (num % j == 0)
{
flag3 = 1;
break;
}
}
if (flag2 != 1 && flag3 != 1)
{
if (flag1 == 0)
{
cout << i;
flag1 = 1;
}
else cout << ',' << i;
}
}
}
if (flag1 == 0) cout << "No" << endl;
return 0;
}
K: B2136 素数回文数的个数
难度: 入门
题意:
求 11 到 n 之间(包括 n) , 既是素数又是回文数的整数有多少个。
思路:
无
代码:
#include <bits/stdc++.h>
using namespace sts;
int n, ans;
int main(void)
{
cin >> n;
for (int i = 11; i <= n; i++)
{
int flag1 = 0, flag2 = 0;
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
flag1 = 1;
break;
}
}
if (flag1 == 0)
{
int a = i, num = 0;
while (a)
{
num = (num + (a % 10)) * 10;
a /= 10;
}
num /= 10;
if (num == i) ans++;
}
}
cout << ans << endl;
return 0;
}
SMU Winter 2023 Round #4 (Div.2)
总结:
本次比赛题目较多 , 难度较大 , 只做出来了五道题 , 而且感觉时间过得很快。第一题最简单很快就能做出来, 第二题 Hotpot 这道题做出来但交了四次才过 , 主要是因为超时了 , 用暴力是做不出来的。其他三道题算是入门题级别 , 但每道题平均花了 30 分钟 , 剩下时间啥也做不出来 , 还是尽力多看算法吧。
A: Chuanpai
题意:
给一个数 , 求川牌上和为这个数的牌有多少个。
每个川牌中有两个数 , 设为 x 和 y , 两个数满足 $ \ 1 \le x , y \le 6$。
思路:
无
注:一个牌中的两个数互换值看做一种情况, 如: (1, 2) 和 (2, 1) 是一种情况。
代码:
#include <bits/stdc++.h>
using namespace std;
int t, n, ans;
int main(void)
{
cin >> t;
while (t--)
{
ans = 0;
cin >> n;
for (int i = 1; i <= 6; i++)
for (int j = i; j <= 6; j++)
{
if (i + j == n) ans ++;
}
cout << ans << endl;
}
return 0;
}
标签:题意,int,void,cin,素数,第二周,include,周报
From: https://www.cnblogs.com/Ailicode/p/17053903.html