2024 年蓝桥杯省赛 C/C++ 大学 B 组一共七道题,这里逐个整理了题目的思路和代码,最后附上一些容易出现的知识点。
题目解析
1. 握手问题
问题描述
50 人开会,每个人要和其他所有人握手一次,但有 7 个人彼此之间没有握手(他们还是与其他人握了)。问总共握了多少次手。A 和 B 握手只算一次。
解题思路
简单组合计数。总共 C(50,2) 次握手,减去那 7 个人之间没发生的 C(7,2) 次,就是答案。代码里用累加实现:从 7 加到 49,对应每个人与后面所有人的握手数。
#include <iostream>
using namespace std;
int main() {
int sum = 0;
for(int i = 7; i <= 49; ++i) sum += i;
cout << sum << endl;
return 0;
}
2. 小球反弹
问题描述
长方形长 343720,宽 2333332,左上角小球速度在长宽方向分量为 15 和 17。碰到边框按入射角反射,问第一次回到起点时走过的路程,保留两位小数。
解题思路
镜像法把折线拉直。当水平位移是长的偶数倍、垂直位移是宽的偶数倍时物归原位。代码从 0 累加时间步,直到两个方向的位移整除各自的边长,然后用勾股定理算路程,乘以 2 是因为去了又回?原代码中 x、y 累加直到整除,然后 sqrt(x^2+y^2) 再乘 2,可能和镜像对称有关,本质上等同于找到最小公倍数。
#include <bits/stdc++.h>
#define ld long double
#define int long long
using namespace std;
signed main(){
int t = 0;
int x = 0, y = 0;
while(true){
t++;
x += ;
y += ;
(x % == && y % == ) ;
}
ld res = ((ld)x * x + (ld)y * y);
res *= ;
(, res);
;
}


