[比赛][蓝桥杯] 第十一届蓝桥杯第二次省赛C++A组
零、前言
对个人而言考得中规中矩吧,前面还行,没啥差错,中后期状态不大行,注意力太集中又临近饭点,做得有点窒息,下次要改良下早饭配方。
从结果来看省一应该有?对省一分数线没啥概念。但目标当然是国一,感觉够呛,等课少了还要再刷点题。
UPDATE - 20201026:确实是省一,从结果来看省一要求还是挺低的。。不过排名比樊总低了好多,哭哭惹。
一、比赛概况
① 题型分布
A, B, C, D, E 共 5 题结果填空题;F, G, H, I, J 共 5 题程序设计题。
② 分值分布
A, B 题 5 分;C, D 题 10 分;E, F 题 15 分,G, H 题 20 分;I, J 题 25 分。
③ 得分情况
B, C, D, E, F, G 应该是满分(共计 75 分);H 保证 20%(4分);I 基本爆零;J 保证 20%(5分),最多 40%(10分);分数区间大致为 [84, 89] 分。
为什么没提 A?下面就知道了哈。
二、题目分析
(手头没题面,题目名称和大意纯凭颅内印象)
A 题 门牌号
题目大意:统计 1 到 2020 所有数的各个数位中的 2 的个数。
思路:可以手算可以编程,逐数逐位枚举。
答案:624
考试过程:
先谢了个程序,结果是 624,于是又手算验证一下,得到 623。机算很难错,然而手算感觉也没问题,于是一方面考虑到分值不高,一方面考虑到可以后面没题做了再来算一次,说不定就对了,就把 623 / 624 两个答案写下来待定。
然而直到最后事实证明根本没什么空闲时间,后面求不出正解的题基本都花了很多时间瞎搞捞分,以至于一直都没有把结果 / 代码誊到系统上,突然想起使匆匆忙忙地填了上去,填时都不知道哪一个是机算哪一个是手算。而根据往常经验,多半就选择了写在前面的 623(?
B 题 既约分数
题目大意:求出所有分数 a / b,满足 a, b 互质,且 1 <= a, b <= 2020。
思路:欧几里得算法判断是否互质,枚举即可。
答案:2481215
考试过程:
很久很久以前,习得一种最精简的求最小公倍数的函数,屡试不爽,然而却总是不记得怎么写的。考前一股神秘的力量推动我记下来这个函数,于是我就记下来了。准备时间我就把模板写了下来,然而我却写错了,也一直没想过是模板记错了,所以这么 ez 的题调了半年才发现错误哈。
我决定再写一次:
int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }
C 题 蛇形矩阵
题目大意:给出下列矩阵,求第 20 行第 20 列的值。
1 2 6 7 15
3 5 8 14
4 9 13
10 12
11
思路:可以手算可以编程,个人认为手算找规律更快,因为所求值所在位置 x = y,直接沿着对角线对所有 x = y 的值找规律,1, 5, 13, 25, 41, 61, ...,每次增加 4, 8, 12, 16, ...,结果就很容易求得了。
答案:761
考试过程:无
D 题 七数码
题目大意:求出七段数码管能表示的不同结果,要求亮的二极管相互连通。
思路:同样可以手算可以编程,首先根据七段数码管的性质构建一张图,相邻的点连成边;然后直接枚举 2 ^ 7 = 128 种情况,针对每一种情况对图进行 DFS,如果能跑到所有亮的二极管,则为可行方案,统计即可。
答案:80
考试过程:无
E 题 直线与圆
题目大意:求出 20 条直线和 20 个圆能将一个平面最多分割成多少部分。
思路:略
答案:1391
考试过程:无
F 题 成绩分析
题目大意:给出 n 名学生的成绩,求出最高分,最低分和平均值。
思路:签到题
代码:略
考试过程:无
G 题 回文年份
题目大意:给出一个 yyyymmdd 形式的日期,先求出该日期之后的下一个日期,要求满足回文形式(即 ABCDDCBA),再求出满足 ABABBABA 形式的下一个日期(两个日期可以为同一天)。
思路:一道将回文判断和日期判断有机结合的实验拼接题。为了避免思路混乱,将 8 个数位的表达式通过 #define 或其他形式表示,会使代码清晰许多。接下来要做的就是对日期逐一枚举,并先后判断是否为回文(及 ABABBABA 形式)和是否为正确日期。
代码:略
考试过程:无
H 题 子串序列
题目大意:给出一个字符串,对于所有子串,统计只出现一次的字符个数,并求总和。
思路:略
代码:略
考试过程:略
I 题 略
题目大意:给出一个椭圆和一个三角形,求两者面积交。
思路:扫描线,微积分(并未求出正解,仅供参考)
代码:略
考试过程:
作为 mathking,看到这道题我是放弃的。甚至,作为 mathking,我在看到样例给出的图之前,压根没意识到那就是一个椭圆;更甚,我思考了许久椭圆的表示方法,以及椭圆的性质。
意识到是一道要用微分法的题目了,对数学的天然抵触以及对新方法的好奇让我做出一个并不明智的选择 —— 我依稀记得多年前有听说过的撒点法,灵机一动,准备用在这里。
先将三角形的四个方向的最远端作为撒点范围,开始撒!判断是否在椭圆内是简单的,即该点到椭圆的两个焦点的距离和小于等于焦距;判断是否在三角形内?我先想到了用函数表达式来求,然而同样是对数学的天然抵触,我选择了用更粗暴的海伦公式 —— 假设三角形顶点为 A, B, C,当前撒的点为 O,如果满足 S△ABO + S△BCO + S△ACO = S△ABC,则说明 O 在三角形内。
能想到这个办法,大家都夸我是小天才。
然而知道海伦公式的都明白,各种浮点数和开平方根的使用,导致结果的精度是个大问题。事实上也确实是这样,撒了半天,连数据范围不及题目给出的万分之一的样例都难以求得精度范围内的结果,39.99 的正解,在多次对 eps 和撒点数量的调整下,始终无法得到,所以直到最后,我交上去的甚至是个样例都过不了的代码。
J 题 冒泡排序
题目大意:要求给出一个字符串,对其进行冒泡排序使其升序排列,进行冒泡排序的 n 次交换后排序完成。
思路:略
代码:略
考试过程:略