2024年蓝桥杯C/C++大学B组省赛真题解析与实战技巧

1. 从“握手问题”到“小球反弹”:开局两道送分题,你真的拿稳了吗?

每年蓝桥杯省赛,前几道题往往被大家戏称为“签到题”,但今年的“握手问题”和“小球反弹”可不仅仅是送分那么简单。它们更像是一个温柔的陷阱,考的就是你的基础是否扎实,心态是否平稳。很多同学一看题目简单,上来就写,结果要么是公式推错,要么是精度丢失,白白丢了本应稳稳到手的分数。

先说说A题的握手问题。这题本质上是一个简单的组合数学问题。题目描述了一个会议场景,有若干人,每两人之间握手一次,问总共握手次数。这其实就是从n个人中选2个人的组合数,公式是 n*(n-1)/2。听起来是不是小学奥数水平?但考场上的压力和环境,很容易让人犯低级错误。我见过有同学直接用 n*(n-1) 忘了除以2,也见过有人用循环累加,结果因为n比较大导致超时。其实这里考察的就是你能不能把生活场景抽象成数学模型,并且选择最高效的计算方式。对于这种题,我的建议是:读完题,先在草稿纸上把公式写出来,确认无误后再敲代码。代码就几行,但心态稳了,这分就拿稳了。

B题的小球反弹,难度稍微提升了一点,开始涉及到物理模拟和数学优化。题目给了一个矩形区域和小球的初始速度,问小球再次回到起点所经过的总路程。最直接的想法当然是模拟——让小球一步步跑,碰到边界就反弹,直到回到起点。但这里有个大坑:直接模拟大概率会超时。因为矩形的尺寸和小球速度可能使得循环次数极其巨大。这道题的精髓在于,你要跳出模拟的思维,用数学方法把问题转化。

关键思路是:将小球的运动分解为水平和垂直两个方向。在每个方向上,小球可以看作是在做独立的“一维运动”。小球要回到起点(包括位置和速度方向都复原),需要它在水平方向和垂直方向都恰好完成了整数个来回。设水平方向周期为 Tx,垂直方向周期为 Ty,那么小球整体回到起点的时间,就是 TxTy 的最小公倍数(LCM)的2倍(因为一次来回)。而总路程就是时间乘以合速度的大小。这里又涉及到分数的最小公倍数计算,需要用到最大公约数(GCD)进行通分。原始文章里给出的代码核心就是这个思路,先分别计算两个方向上的“半周期”,求其最小公倍数得到总时间,最后计算路程。

#include<bits/stdc++.h>
using namespace std;
// 求最大公约数
int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}
int main() {
    int dx = 15, dy = 17; // 速度分量
    int x = 343720, y = 233333; // 矩形半长/半宽?这里需要根据题目理解具体含义
    // 计算两个方向上的“半周期”比例
    int p = dy * x, q = dx * y;
    int g = gcd(p, q);
    p /= g, q /= g;
    // 计算总时间(最小公倍数的2倍)
    int t = 2 * p * x / dx; // 注意公式推导,这里用p和x、dx的关系
    // 计算总路程
    double ans = t * sqrt(dx*dx + dy*dy);
    printf("%.2lf\n", ans);
    return 0;
}

敲黑板!这里最容易出错的有两点:一是对题目中给出的 xy 的理解,它们到底是矩形的长宽,还是半长半宽?这直接影响到周期公式。二是最后计算路程时,速度要用合速度,而不是某个方向的分速度。很多同学算对了时间,却在最后一步用了 dxdy,功亏一篑。所以,对于这种数理题,一定要在编码前彻底完成纸笔推导,把每个变量的物理意义标清楚。

2. “好数”与“R格式”:字符串处理与高精度运算的经典组合

从C题开始,题目的综合性就加强了。C题“好数”是一个典型的枚举+数位判断问题。题目定义了一种“好数”:对于一个奇数,如果它的各位数字中,奇数位(从个位开始数,个位是第1位)是奇数,偶数位是偶数,那么这个数就是好数。给你一个上限N,问从1到N有多少个好数。

最朴素的思路就是暴力枚举1到N的每一个奇数(因为偶数肯定不是好数),然后对每个数逐位判断。时间复杂度是 O(N * log(N))。当N达到10^5甚至更大时,很多同学就开始担心会不会超时。但实测下来,对于省赛的数据规模,这个复杂度是完全可行的。这里考察的是你对时间复杂度的估算能力敢于暴力求解的勇气。当然,暴力也有技巧,比如只枚举奇数,在循环内部用 while 循环和取模运算快速进行数位分离与判断。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll n; cin >> n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值