吉林省网站建设_网站建设公司_移动端适配_seo优化
2026/1/21 15:13:34 网站建设 项目流程

​欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总贴:历年蓝桥杯真题解析 | 汇总


P12130 移动距离

【题目来源】

洛谷:[P12130 蓝桥杯 2025 省 B] 移动距离 - 洛谷

【题目描述】

小明初始在二维平面的原点,他想前往坐标 \((233, 666)\)。在移动过程中,他只能采用以下两种移动方式,并且这两种移动方式可以交替、不限次数地使用:

  1. 水平向右移动,即沿着 \(x\) 轴正方向移动一定的距离。
  2. 沿着一个圆心在原点 \((0, 0)\)、以他当前位置到原点的距离为半径的圆的圆周移动,移动方向不限(即顺时针或逆时针移动不限)。

在这种条件下,他到达目的地最少移动多少单位距离?你只需要输出答案四舍五入到整数的结果。

【输入】

【输出】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只需要编写一个程序输出这个整数,输出多余的内容将无法得分。

【解题思路】

image

【算法标签】

《洛谷 P12130 移动距离》 #数学# #微积分# #蓝桥杯省赛# #2025#

【代码详解】

#include <bits/stdc++.h>
using namespace std;
double r;
int main()
{r = sqrt(233 * 233 + 666 * 666);  // 计算直角三角形的斜边长度double theta = atan(1.0 * 666/233);  // 计算反正切值,即角度θcout << round(r*theta + r) << endl;  // 输出计算结果return 0;
}

【运行结果】

1576

P12134 画展布置

【题目来源】

洛谷:[P12134 蓝桥杯 2025 省 B] 画展布置 - 洛谷

【题目描述】

画展策展人小蓝和助理小桥为即将举办的画展准备了 \(N\) 幅画作,其艺术价值分别为 \(A_1, A_2, \dots , A_N\)。他们需要从这 \(N\) 幅画中挑选 \(M\) 幅,并按照一定顺序布置在展厅的 \(M\) 个位置上。如果随意挑选和排列,艺术价值的变化可能会过于突兀,导致观众的观展体验不够流畅。

为了优化布置,他们查阅了《画展布置指南》。指南指出,理想的画展应使观众在欣赏画作时,艺术价值的过渡尽量平缓。指南建议,选择并排列 \(M\) 幅画,应使艺术价值的变化程度通过一个数值 \(L\) 来衡量,且该值越小越好。数值 \(L\) 的定义为:

\[L=\sum_{i=1}^{M-1} |B_{i+1}^2-B_i^2| \]

其中 \(B_i\) 表示展厅第 \(i\) 个位置上画作的艺术价值。

现在,他们希望通过精心挑选和排列这 \(M\) 幅画作,使 \(L\) 达到最小值,以提升画展的整体协调性。请你帮他们计算出这个最小值是多少。

【输入】

输入共两行。

第一行包含两个正整数 \(N\)\(M\),分别表示画作的总数和需要挑选的画作数量。

第二行包含 \(N\) 个正整数 \(A_1, A_2, \dots , A_N\),表示每幅画作的艺术价值。

【输出】

输出一个整数,表示 \(L\) 的最小值。

【输入样例】

4 2
1 5 2 4

【输出样例】

3

【算法标签】

《洛谷 画展布置》 #数学# #排序# #前缀和# #双指针two-pointer# #蓝桥杯省赛# #2025#

【代码详解】

#include <bits/stdc++.h>
using namespace std;
#define int long long  // 将int重定义为long long
int n, m, a[100005], ans = 1e16;  // n: 数字个数, m: 需要选取的数字个数, a: 存储数字, ans: 答案signed main()  // 由于#define int long long,需要使用signed main
{cin >> n >> m;  // 输入数字个数n和需要选取的数字个数mfor (int i = 1; i <= n; i++)cin >> a[i];  // 读入n个数字sort(a + 1, a + n + 1);  // 对数组进行升序排序// 寻找最小值for (int i = m; i <= n; i++)  // 遍历可能的子数组终点{int j = i - m + 1;  // 计算子数组起点int t = a[i] * a[i] - a[j] * a[j];  // 计算当前子数组的最大最小值平方差ans = min(t, ans);  // 更新最小值}cout << ans << endl;  // 输出答案return 0;
}

【运行结果】

4 2
1 5 2 4
3

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询