概述
本文整理了 2024 年第十五届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组的七道题目解析及相关知识点。
题目解析
1. 握手问题
问题描述 小蓝组织了一场算法交流会议,总共有 50 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 7 个人,这 7 人彼此之间没有进行握手 (但这 7 人与除这 7 人以外的所有人进行了握手)。请问这些人之间一共进行了多少次握手? 注意 A 和 B 握手的同时也意味着 B 和 A 握手了,所以算作是一次握手。
解题思路 这是一个简单的组合问题。可以通过枚举计算,或者利用组合公式推导。7 个人内部不握手,相当于从总握手次数中减去这 7 人之间的握手数。
#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 单位长度。在其内部左上角顶点有一小球,其初速度分解到长宽两个方向上的速率之比为 dx:dy=15:17。小球碰到长方形的边框时会发生反弹,每次反弹的入射角与反射角相等。从小球出发到其第一次回到左上角顶点这段时间里,小球运动的路程为多少单位长度?答案四舍五入保留两位小数。
解题思路 利用镜像对称法,将折线运动转化为直线运动。通过模拟时间步长找到回到起点的最小公倍数时刻,计算路程。
#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);
;
}


