这次是本蒟蒻第一次参加蓝桥,可谓是败了个彻头彻尾,身败名裂。
真的很烦,最后两题没有在比赛时间内AC
考后重新复盘发现,莫名期待各种压力加持下,脑子短路,代码都敲的手抖就离谱,平时的码风在比赛中都成了坨屎。瞬间秒出的优化思路也犹如坠入淤泥之中,滞涩不已。
接下来得练出个大心脏,临危不惧。
虽说紧张也和自身实力有关,但这次连70%的水平都没发挥出来就真的离谱了
毕竟是场四小时的比赛,四个小时内都没找回状态真的fw。
尤其是最后一题白给题,有了题号加成竟然没有看出他白给的本质,真的败得一塌糊涂嘤嘤嘤。。。
接下来正片
文章目录
试题A: 门牌制作
本题总分:5 分
【问题描述】
小蓝要为一条街的住户制作门牌号。 这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。 小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字 符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个 字符 0,2 个字符 1,1 个字符 7。 请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
显而易见,一道热身白给题,枚举1到2020,求中间有几个2
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int sum,ans[10];//记录每个数字出现几次
void get(int a) {
while (a)
{
ans[a % 10]++;
a /= 10;
}
}
int main() {
for (int i = 1; i <= 2020; i++)
get(i);
cout << ans[2];
return 0;
}
答案:624
试题 B: 既约分数
本题总分:5 分
【问题描述】
如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。 例如,3 4, 5 2, 1 8, 7 1 都是既约分数。 请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个 整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
依旧白给,考察点GCD(最大公约数)求法
1.欧几里得法(辗转相除法):比赛时脑瘫了不敢用,写了下面那种写法
2.做差法
双重循环嵌套枚举分子分母所有情况,本题蛮友好没有坑,直接枚举就行了`
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int gcd(int a, int b) {
if (b == 0)
return a;
gcd(b, a % b);
}
int main() {
int sum = 0;
for (int i = 1; i <= 2020; i++)
{
for (int j = 1; j <= 2020; j++)
{
if (gcd(i, j) == 1)
sum++;
}
}
cout << sum;
return 0;
}
答案:2481215
试题 C: 蛇形填数
本题总分:10 分
【问题描述】 如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。
容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列 的数是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
我们考场好多拿EXCEL慢慢画的。。。。
其实很简单,一开始慌了想做矩阵模拟,想了一分钟突然发现求的是(20,20),做过八皇后的肯定可以发现,这玩意所在蛇形数的列数在反对角线的平行线上,20+20=39+1可以推出他在第39行的中间数。所以我们可以枚举1到38行的和,然后加半个39行,答案就出来了
代码有点麻烦先不敲了占个坑,以后回来补
答案是761
试题 D: 跑步锻炼
本题总分:10 分
【问题描述】
小蓝每天都锻炼身体。 正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了 激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。 小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
害,看到这种带闰年条件多的就烦,一开始跳了最后两题没出来回来做也不知道为啥不想深入想,就分别算了全部日期+1号+周一的和,然后减去重复部分。答案也是8开头具体多少记不清了,现在重新补上代码。
所以说考试心态很重要哇,这种简单白给题不想做就真的烦
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int day[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
void judge(int y) {
if ((y % 100 != 0 && y % 4 == 0) || y % 400 == 0)
day[2] = 29;
else
day[2] = 28;
}
int main() {
int ans = 0;
int d = 1, m = 1, y = 2000,w = 5;//初始化 周六 一月 2000年
judge(y);
while (y <= 2020)
{
judge(y);
if (y == 2020)
{
for (m = 1; m < 10; m++)
{
for (d = 1; d <= day[m]; d++)
{
if (d == 1 || w == 0)
ans += 2;
else
ans += 1;
w = (w + 1) % 7;
}
}
}
else
{
for (m = 1; m <= 12; m++)
{
for (d = 1; d <= day[m]; d++)
{
if (d == 1 || w == 0)
ans += 2;
else
ans += 1;
w = (w + 1) % 7;
}
}
}
y++;
}
cout << ans+2;//10.2号还要跑2km
return 0;
}
答案:8879
试题 E: 七段码
本题总分:15 分
【问题描述】
小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二 极管,分别标记为 a, b, c, d, e, f, g。 小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符 的表达时,要求所有发光的二极管是连成一片的。 例如:b 发光,其他二极管不发光可以用来表达一种字符。 例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上 一行的方案可以用来表示不同的字符,尽管看上去比较相似。 例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。 例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光 的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
这道题我看其他人的深搜都有判断是否为连通图,我的深搜就把条件拆开来写,虽然感觉蛮麻烦但应该是对的,不过答案和他们对不上是67,应该我错了。
附上错误代码希望有大佬能够指正
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int vis[10];//存储明暗状态abcd...依此存放
int ans;
void dfs(int idex) {
if (idex == 8)
{
//将这七个管子分成6种情况:a,f,g分别为一组 bc为一组 d,e分别为一组
if (vis[0])//a亮
{
if (!vis[1] && !vis[5])//b和f都不亮直接退出
return;
}
if (vis[5])//f亮
{
if (!vis[6] && !vis[0] && !vis[4])//a,e,g都不亮就退出
return;
}
//最后一种情况
for (int i = 1; i <= 2; i++)
{
if (vis[i])
{
if (!vis[6] && !vis[i + 1] && !vis[i - 1])
return;
}
}
if (vis[3])
{
if (!vis[2] && !vis[4])
return;
}
if (vis[4])
{
if (!vis[3] && !vis[5] && !vis[6])
return;
}
ans++;
}
else
{
//点亮
vis[idex] = 1;
dfs(idex + 1);
vis[idex] = 0;//回溯
//不亮的情况
dfs(idex + 1);
}
}
int main() {
dfs(0);//从a开始深搜
cout << ans;
return 0;
}
答案:80
试题 F: 成绩统计
时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是 一个 0 到 100 的整数。 如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整
数。
【输入格式】
输入的第一行包含一个整数 n,表示考试人数。 接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
【输出格式】
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。
【样例输入】 7 80 92 56 74 88 100 0
【样例输出】 71% 43%
【评测用例规模与约定】 对于 50% 的评测用例,1≤n≤100。 对于所有评测用例,1≤n≤10000。
水题就不上代码了
试题 G: 回文日期
时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】 2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202, 恰好是一个回文数。我们称这样的日期是回文日期。 有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为 不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。 也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千 年一遇”,顶多算 “千年两遇”。 给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
【输入格式】
输入包含一个八位整数 N,表示日期。
【输出格式】 输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下 一个 ABABBABA 型的回文日期。
【样例输入】
20200202
【样例输出】
20211202
21211212
【评测用例规模与约定】 对于所有评测用例,10000101 ≤ N ≤ 89991231,保证 N 是一个合法日期的 8 位数表示。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int ans1[8], ans2[8], temp[8];
void get(int a) {
for (int i = 7; i >= 0; i--)
{
temp[i] = a % 10;
a /= 10;
}
}
bool ABans() {
if (temp[0] == temp[2] && temp[1] == temp[3] && temp[0] != temp[1])
{
for (int i = 0; i < 4; i++)
if (temp[i] != temp[7 - i])
return 0;
return 1;
}
return 0;
}
bool ans() {
for (int i = 0; i < 4; i++)
if (temp[i] != temp[7 - i])
return 0;
return 1;
}
int main() {
int n;
cin >> n;
get(n);
bool f1=0, f2=0;
int i;
for (i = n + 1; i <= 99999999; i++)
{
get(i);
if (f1 && f2)
break;
if (ABans()&&!f1)
{
for (int j = 0; j <= 7; j++)
ans1[j] = temp[j];
f1 = 1;
continue;
}
if (ans()&&!f2)
{
for (int j = 0; j <= 7; j++)
ans2[j] = temp[j];
f2 = 1;
}
}
// printf("i=%d\n", i);
for (int i = 0; i < 8; i++)
cout << ans2[i];
cout << '\n';
for (int i = 0; i < 8; i++)
cout << ans1[i];
return 0;
}
试题 H: 子串分值和
时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
对于一个字符串 S,我们定义 S 的分值 f(S) 为 S 中出现的不同的字符个 数。例如 f(”aba”) = 2,f(”abc”) = 3, f(”aaa”) = 1。 现在给定一个字符串 S[0…n−1](长度为 n),请你计算对于所有 S 的非空 子串 S[i…j](0≤i≤ j < n),f(S[i…j]) 的和是多少。
【输入格式】
输入一行包含一个由小写字母组成的字符串 S。
【输出格式】
输出一个整数表示答案。
【样例输入】
ababc
【样例输出】
28
【样例说明】
子串 f值
a 1
ab 2
aba 2
abab 2
ababc 3
b 1
ba 2
bab 2
babc 3
a 1
ab 2
abc 3
b 1
bc 2
c 1
【评测用例规模与约定】
对于 20% 的评测用例,1≤n≤10;
对于 40% 的评测用例,1≤n≤100;
对于 50% 的评测用例,1≤n≤1000;
对于 60% 的评测用例,1≤n≤10000;
对于所有评测用例,1≤n≤100000。
这道题可以用set去重,但是本蒟蒻不会,只知道集合有这个去重的性质,所以我选择了另一种做法,开标记数组记录有没有来过,若来过则不继续累加,没来过就加。每扫完一处区间,必须初始化标记数组。
复杂度o(n^2*k)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int vis[30];
int main() {
string s;
cin >> s;
int len = s.length(), ans = 0;
for (int i = 0; i < len; i++)//区间左界
{
for (int j = i + 1; j < len; j++)//区间右界
{
for (int k = i; k <= j; k++)//k为移动光标,在i到j里移动
{
if (!vis[s[k] - 'a'])//该字符没有出现过
{
vis[s[k] - 'a'] = 1;
ans++;
}
}
for (int p = 0; p <= 29; p++)//复原标记数组
vis[p] = 0;
}
}
/*字串长度为1的情况在循环里是不会算上的
长度为1的字串个数就是原串长度,最后加上就好了*/
ans += len;
cout << ans;
return 0;
}
试题 I: 平面切分
时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分
【问题描述】 平面上有 N 条直线,其中第 i 条直线是 y = Ai ·x + Bi。 请计算这些直线将平面分成了几个部分。
【输入格式】
第一行包含一个整数 N。 以下 N 行,每行包含两个整数 Ai,Bi。
【输出格式】
一个整数代表答案。
【样例输入】 3 1 1 2 2 3 3
【样例输出】 6
【评测用例规模与约定】 对于 50% 的评测用例,1≤ N ≤4, −10≤ Ai,Bi ≤10。 对于所有评测用例,1≤ N ≤1000, −100000≤ Ai,Bi ≤100000。
本题本蒟蒻实在无能为力,占坑等日后更强了再回来填坑
试题 J: 字串排序
时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分
【问题描述】
小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。
在冒泡排序中,每次只能交换相邻的两个元素。
小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。 例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序, 总共需要 4 次交换。
小蓝的幸运数字是 V,他想找到一个只包含小写英文字母的字符串,对这个串中的字符进行冒泡排序,正好需要 V 次交换。请帮助小蓝找一个这样的字 符串。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个, 请告诉小蓝字典序最小的那个。请注意字符串中可以包含相同的字符。
【输入格式】
输入一行包含一个整数 V,为小蓝的幸运数字。
【输出格式】
输出一个字符串,为所求的答案。
【样例输入】 4
【样例输出】 bbaa
【样例输入】 100
【样例输出】 jihgfeeddccbbaa
【评测用例规模与约定】 对于 30% 的评测用例,1≤V ≤20。
对于 50% 的评测用例,1≤V ≤100。
对于所有评测用例,1≤V ≤10000。
由此可见本题为规律题,其实只要心态放好,都能轻易发现
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main() {
int n;
cin >> n;
int sum = 0, i;
for (i = 1; sum <= n; i++)
sum += i;
//此时i是字符串长度
int d = sum - n;//重复部分
vector<int>a(i);
for (int j = 0; j < i; j++)
a[j] = j;
int len = i-1;
for (int k = 0; k < d; k++)
{
a[len--] = k;
}
sort(a.begin(), a.end());
for (int p = i-1; p >= 0; p--)
{
char ans = a[p] + 'a';
cout << ans;
}
}
遗憾刚刚代入7发现我的解法是错的,7这种情况出现了三次重复输出应为cbaaa
还是先留个坑以后再填吧嘤嘤嘤
10.26更
今天蓝桥出结果了,估分80左右省一排名中上,国赛加油吧(ง •̀_•́)ง一定要一雪前耻!
欢迎大佬前来找茬
10.19更新:最后一题已经有AC思路,今天敲了大部分代码身心俱疲(严重怀疑自己比赛有几个细节出错现在已经由最开始的纠结痛苦到看破红尘。大不了明年再去北大蹭饭嘤嘤嘤。
应战能力还得多练啊5555
CF和洛谷的比赛都不能偷懒了。
最后一题10.20更