1. 蓝桥杯省赛C/C++大学B组真题解析
蓝桥杯作为国内最具影响力的计算机类竞赛之一,其省赛题目往往能真实反映参赛者的编程能力和算法思维。对于C/C++大学B组的选手来说,掌握常见题型的解题思路和优化技巧至关重要。本文将结合具体真题,分享实战中的解题策略。
1.1 握手问题解析与优化
握手问题作为经典排列组合题,在2024年省赛中以第一题出现。题目描述为:50人的会议中有7人互不握手,求实际发生的握手次数。
最直观的解法是组合数学计算:
int total = 50 * 49 / 2; // 无限制时的总握手数
int cnt = 7 * 6 / 2; // 7人内部的握手数
cout << total - cnt; // 最终结果1204
但在实际比赛中发现,很多选手会陷入两个误区:
- 忘记处理整数除法截断问题
- 错误计算排除部分的组合数
更稳妥的做法是采用暴力枚举验证:
int ans = 0;
for(int i=1; i<=50; i++){
for(int j=i+1; j<=50; j++){
if(!(i<=7 && j<=7)) ans++;
}
}
1.2 小球反弹的数学建模
这道物理模拟题要求计算小球在矩形区域内的反弹总路程。关键在于将二维运动分解为x、y方向:
int dx=15, dy=17; // 速度分量
int x=343720, y=233333; // 场地尺寸
// 计算运动周期
int gcd_val = gcd(dx*x, dy*y);
int t = 2 * x * y / gcd_val;
// 计算总路程
double distance;

