第十六届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组题目涵盖了算法设计、数据结构、数学逻辑等多个方面,对参赛者的编程能力和问题解决能力提出了较高要求。以下是对部分典型题目的解析及解题思路:
1. 移动距离问题
题目描述:小明从原点出发,需要移动到坐标 (233, 666),可以选择两种移动方式:
- 向右水平移动固定距离。
- 沿以当前位置到原点的距离为半径的圆周移动。
解题思路:
-
最短路径分析:直接水平移动到 x=233,然后沿圆弧移动到 (233, 666) 是最短路径。
-
计算步骤:
-
计算水平移动距离:
233。 -
计算圆弧长度:
- 半径
r = sqrt(233^2 + 666^2)。 - 圆心角
theta = atan(666 / 233)(弧度制)。 - 圆弧长度
L = r * theta。
- 半径
-
总距离为水平距离与圆弧长度之和。
-
代码示例:
答案:
1576
2. 客流量上限问题
题目描述:2025 家分店,编号 1 至 2025,需为每家分店设定每日客流量上限 A1, A2, ..., A2025,满足:
A1, A2, ..., A2025是 1 至 2025 的排列。- 对任意分店
i和j,Ai * Aj <= i * j + 2025。
解题思路:
-
规律发现:通过小规模数据枚举,发现排列数满足
2^(n/2)的规律。 -
公式推导:
- 当
n为偶数时,排列数为2^(n/2)。 - 当
n为奇数时,排列数为2^((n-1)/2)。
- 当
-
计算:
- 对于
n = 2025,排列数为2^1012。 - 对结果取模
10^9 + 7。
- 对于
代码示例:
答案:
781448427
3. 可分解的正整数问题
题目描述:给定 N 个正整数,判断每个数是否可以表示为连续递增整数之和(长度至少为 3)。
解题思路:
-
数学分析:
- 连续整数之和公式:
S = k * m + k * (k - 1) / 2,其中k为项数,m为起始数。 - 遍历可能的
k和m,判断是否存在满足条件的分解。
- 连续整数之和公式:
-
优化:
- 排除
1,因为无法构成长度至少为 3 的序列。 - 对于其他数,直接判断是否可以分解。
- 排除
代码示例:
答案:根据输入数据计算,例如样例输出为
3。