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

2024年第十五届蓝桥杯大赛软件赛省赛C/C++大学C组真题 打卡第二篇。 阅读详情

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

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

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

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

关键思路是:将小球的运动分解为水平和垂直两个方向。在每个方向上,小球可以看作是在做独立的“一维运动”。小球要回到起点(包括位置和速度方向都复原),需要它在水平方向和垂直方向都恰好完成了整数个来回。设水平方向周期为 Tx,垂直方向周期为 Ty,那么小球整体回到起点的时间,就是 Tx 和 Ty 的最小公倍数(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;
}

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

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;
    ll count = 0; // 注意,从1开始,1算不算?需要看题目定义
    for(ll i = 1; i <= n; i++) {
        if(i % 2 == 0) continue; // 偶数跳过
        ll cur = i;
        ll pos = 1; // 当前位置,从个位(第1位)开始
        bool isGood = true;
        while(cur) {
            ll digit = cur % 10;
            // 判断:奇数位应为奇数,偶数位应为偶数
            if( (pos % 2 == 1 && digit % 2 == 0) || (pos % 2 == 0 && digit % 2 == 1) ) {
                isGood = false;
                break;
            }
            pos++;
            cur /= 10;
        }
        if(isGood) count++;
    }
    cout << count << '\n';
    return 0;
}

需要注意的细节是:数位是从右向左(从低位到高位)数的。个位是第1位(奇数位),十位是第2位(偶数位),以此类推。循环中的 pos 变量就是用来记录当前是第几位的。另外,数字1只有个位,个位是1(奇数),且是奇数位,所以1通常是好数(除非题目特别说明)。这些边界条件一定要在编码时考虑清楚。

D题“R格式”是一道非常好的高精度运算题。题目要求将一个可能包含小数的数字 d 乘以 2^n,然后对结果进行四舍五入到整数。n 可以很大(比如几十),直接使用 double 进行浮点数计算肯定会溢出或精度丢失。所以,我们必须用高精度来模拟整数和定点数的乘法。

核心思路是:把输入的数字 d 当作字符串处理,去掉小数点和小数点后的部分,得到一个整数序列(可以用 vector<int> 存储,低位在前)。然后对这个序列进行 n 次“乘以2”的操作,这本质上就是高精度乘低精度。每次乘法从低位到高位,当前位乘以2加上进位,然后更新进位。全部乘完后,就得到了 d * 2^n 的精确整数结果(但此时它包含了原来小数部分放大后的结果)。

接下来是最容易出错的一步:四舍五入。原始文章里给出了一个90分代码和一个满分代码,区别就在于四舍五入的处理。90分代码只考虑了小数点后第一位是否>=5,但这是错误的。例如,对于数字 89.98,乘以 2^n 放大后,小数部分 .98 对应的整数部分是98。四舍五入时,98 >= 50,所以应该向整数部分进1,整数部分89变成90。如果只判断最后一位(8),就会漏掉这次进位。正确的做法是:从小数部分的最低位(即我们存储的整数的前几位)开始,依次向前(向高位)判断是否需要进位。如果某一位 >=5,则向它的前一位进1。这个进位可能会像多米诺骨牌一样一直传递到整数部分的最高位。

// ... 高精度乘法部分省略 ...
// 假设 res1 中存储了放大后的整数,idx 记录了原小数点的位置(从低位开始数)
// 需要进行四舍五入
reverse(res1.begin(), res1.end()); // 为了方便处理,转为高位在前
int last_digit = -1;
// 移除原小数部分(idx位),并记录最后一位的值用于判断
while(idx--) {
    last_digit = res1.back();
    res1.pop_back();
}
// 如果原小数部分的最后一位 >=5,则需要进位
if(last_digit >= 5) {
    reverse(res1.begin(), res1.end()); // 转为低位在前方便进位
    int carry = 1; // 进位1
    for(int i = 0; i < res1.size(); i++) {
        res1[i] += carry;
        carry = res1[i] / 10;
        res1[i] %= 10;
    }
    if(carry) {
        res1.push_back(carry);
    }
    reverse(res1.begin(), res1.end()); // 转回高位在前输出
}
// 输出结果
for(auto x : res1) cout << x;

这道题综合考察了字符串处理、高精度运算和细致的逻辑思维。我建议大家在平时练习时,一定要自己动手实现一遍高精度的加、减、乘,理解其核心的“按位运算与进位处理”模式,这样在考场上才能灵活应对。

3. “宝石组合”与“数字接龙”:算法思维与DFS搜索的实战

E题“宝石组合”是一道很有意思的题目,它看起来像是一道数学题,但最终落脚点却是一个巧妙的算法优化。题目给了n个正整数,要你找出其中三个数,使得它们的某个特征值S最大。这个S经过推导(如原始文章中的验证代码所示),其实就是这三个数的最大公约数(GCD)。所以问题转化为:从n个数中选三个数,使得它们的最大公约数尽可能大。

最暴力的方法是三重循环枚举所有三元组,计算GCD,记录最大值。时间复杂度是 O(n^3),当n=10^5时显然不可行。这里就需要我们进行算法优化。一个常见的技巧是:枚举答案。既然我们要找最大的GCD,那么我们可以从可能的最大值(即数组中最大的数)开始,向下枚举每一个可能的GCD值 g,然后检查数组中是否有至少三个数是 g 的倍数。如果有,那么 g 就是一个合法的三元组的GCD,并且由于我们是逆序枚举,第一个找到的 g 就是最大的。

如何高效地检查呢?我们可以预处理一个“倍数桶”。对于数组中的每个数 a[i],我们找出它的所有约数(只需要枚举到 sqrt(a[i])),然后把这个数加入到它每个约数对应的列表中。这样,对于任意一个数 g,tong[g] 这个列表里存储的就是原数组中所有能被 g 整除的数。之后,我们从大到小枚举 g,只要 tong[g].size() >= 3,我们就取这个列表里最小的三个数(因为题目要求字典序最小)输出即可。如果枚举完都没有找到,说明最大公约数就是1,直接输出排序后最小的三个数。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    ll n; cin >> n;
    vector<ll> a(n);
    for(ll i=0; i<n; i++) cin >> a[i];
    sort(a.begin(), a.end());
    unordered_map<ll, vector<ll>> bucket; // 约数 -> 拥有该约数的数列表
    // 预处理倍数桶
    for(ll num : a) {
        for(ll d=1; d*d <= num; d++) {
            if(num % d == 0) {
                bucket[d].push_back(num);
                if(d != num/d) { // 避免重复添加平方数的情况
                    bucket[num/d].push_back(num);
                }
            }
        }
    }
    // 从大到小枚举可能的gcd
    bool found = false;
    for(ll g = a.back(); g >= 1; g--) {
        if(bucket.count(g) && bucket[g].size() >= 3) {
            // 输出该桶中最小的三个数
            cout << bucket[g][0] << " " << bucket[g][1] << " " << bucket[g][2];
            found = true;
            break;
        }
    }
    if(!found) { // 所有数互质,gcd最大为1
        cout << a[0] << " " << a[1] << " " << a[2];
    }
    return 0;
}

这个解法的时间复杂度主要在于预处理部分,每个数找约数是 O(sqrt(a_i)),总体可以接受。它巧妙地将一个求三元组的问题,转化为了基于约数统计的枚举问题,是蓝桥杯中常见的“正难则反”思维。

F题“数字接龙”是一个标准的深度优先搜索(DFS)题,但加上了不少限制条件,使得它比普通的迷宫搜索要复杂。题目给定一个n*n的网格,每个格子有一个0到k-1的数字。你需要从(1,1)走到(n,n),每一步可以走八个方向(上下左右加斜角),但必须满足:1. 走的格子数字必须是 (当前步数 % k);2. 路径不能交叉或重复访问;3. 路径的字典序最小(方向用0-7的数字表示)。

这种求字典序最小的路径,通常的DFS策略是:按方向编号从小到大进行搜索。这样,第一个搜索到的完整路径,自然就是字典序最小的。但这里有一个巨大的优化点:一旦找到一条合法路径,就应该立即结束整个搜索过程,因为继续搜索只会找到字典序相同或更大的路径。这就是原始文章代码中 bool ac 变量的作用,它是一个全局标志位,一旦置为 true,所有递归分支都直接返回。

另一个难点是路径不能交叉的判断。题目中说的“不能交叉”并不是简单的不能走回头路(这由 st 访问数组保证了),而是特指一种情况:不能“绕过”一个已经访问过的格子形成交叉。原始文章代码中那几个 if(i==1 && ...) 的条件判断,就是为了防止这种交叉。例如,方向1是右上角(-1,1),如果当前格子的左边(x-1,y)和上边(x,y+1)都已经被访问过,那么从当前格子走到右上角格子,就会和之前访问过的路径形成一个“包围”式的交叉,这是不允许的。对于四个斜角方向,都需要进行类似的判断。

int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};
// ... 在dfs循环中 ...
for(int i=0; i<8; ++i){
    int nx = x + dx[i];
    int ny = y + dy[i];
    // ... 边界、访问、数字匹配判断 ...
    // 防止路径交叉的判断
    if(i==1 && st[x-1][y]==1 && st[x][y+1]==1) continue; // 右上方向
    if(i==3 && st[x+1][y]==1 && st[x][y+1]==1) continue; // 右下方向
    if(i==5 && st[x+1][y]==1 && st[x][y-1]==1) continue; // 左下方向
    if(i==7 && st[x-1][y]==1 && st[x][y-1]==1) continue; // 左上方向
    // ... 递归搜索 ...
}

写这类DFS题目,一定要把状态标记(st数组)和回溯(pop_back, st[nx][ny]=false)写对。递归前标记和压入路径,递归后恢复状态,这是标准模板。同时,要仔细理解题目中所有限制条件,并转化成代码中的剪枝语句,这样才能避免超时。

4. “爬山”与“拔河”:贪心陷阱与区间和的巧妙处理

G题“爬山”是本届比赛争议比较大的一道题。题目有n座山,每座山有一个高度。你有两种操作:1. 使用一次“魔法A”,使一座山的高度变为原来的平方根(向下取整)。2. 使用一次“魔法B”,使一座山的高度变为原来的一半(向下取整)。你各有P次和Q次使用机会,问如何操作能使所有山的总高度最小。

很多同学的第一反应,也是原始文章中提到的“优先队列贪心”法:每次选择当前最高的山,看是除以2下降得多,还是开平方根下降得多,就选哪种操作。这个贪心策略听起来很合理,而且能过大部分样例,甚至能拿到92分的高分。但是,它并不是完全正确的。贪心策略在这里失效的原因在于,操作之间不是独立的。对一座山连续使用两种不同的操作,其效果可能与分别对两座山使用不同操作的效果不同。例如,一座非常高的山,先开平方根再除以2,减少的高度可能远大于对两座不同的山分别进行操作。

原始文章提到了“得用dp”,这指向了正确的方向。这是一个资源分配型的动态规划问题。我们可以定义状态 dp[i][p][q] 表示考虑前i座山,使用了p次A操作和q次B操作时,这些山的最小总高度。但状态空间太大(n, P, Q都可能达到2000),无法直接实现。更可行的思路是,对于每一座山,我们可以预处理出使用不同次数(a次A和b次B,满足a+b <= P+Q)操作后,这座山能达到的最小高度。由于操作顺序不影响最终结果(因为除2和开方都是可交换的),我们可以枚举a和b。然后,问题就变成了一个“分组背包”问题:有n组物品(n座山),每组物品里有若干种选择(不同的操作组合及其最终高度),每组必须选一个物品,总操作次数有限制,求最小总高度。

// 思路伪代码,并非AC代码
// 1. 预处理每座山的状态
for 每座山的高度 h {
    for a from 0 to P {
        for b from 0 to Q {
            if (a+b > P+Q) continue;
            height[a][b] = 对h进行a次开方和b次除2后的结果;
        }
    }
}
// 2. 分组背包DP
vector<vector<ll>> dp(P+1, vector<ll>(Q+1, INF));
dp[0][0] = 0;
for 每座山 i {
    vector<vector<ll>> new_dp = dp; // 滚动数组优化
    for p_used from 0 to P {
        for q_used from 0 to Q {
            if(dp[p_used][q_used] == INF) continue;
            for a from 0 to (P - p_used) {
                for b from 0 to (Q - q_used) {
                    new_dp[p_used+a][q_used+b] = min(new_dp[p_used+a][q_used+b],
                                                     dp[p_used][q_used] + height[i][a][b]);
                }
            }
        }
    }
    dp = move(new_dp);
}
// 答案就是 dp[P][Q]

这个DP的复杂度是 O(n * P^2 * Q^2),仍然很高,需要根据数据范围进行优化,比如注意到操作次数很多时,山的高度会很快降到1,之后操作无效,可以提前终止枚举。这道题在考场上想拿满分非常难,它考察的是选手对贪心算法局限性的认识,以及将复杂问题转化为经典模型(背包DP)的能力。

H题“拔河”则是一道关于区间和的题目。给定一个序列,要求将其划分为两个连续的、不相交的子区间,使得两个区间和的总和之差最小。注意,是分成两个连续的区间,而不是任意挑两段。这意味着我们只需要找一个分割点 k,左边区间是 [1, k],右边区间是 [k+1, n],然后计算两边和的差值。但题目要求的是两个区间,并没有说必须是前后分割,也可以是中间两段,只要它们连续且不相交。所以更一般的理解是:找两个不相交的连续子数组,使得它们各自的和的差值最小。

暴力枚举所有可能的区间对是 O(n^4) 的,显然不行。一个优化思路是:先预处理前缀和 s[i],那么任意连续区间 [l, r] 的和就是 s[r] - s[l-1]。我们可以枚举所有可能的区间和以及它的起始位置,存储在一个数组里。然后按区间和的大小排序。排序后,差值最小的两个区间和,很可能在排序后的数组中相邻(但不一定,因为区间可能重叠)。所以我们只需要检查排序后相邻的区间对,如果它们对应的区间不相交,就用它们的差值更新答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll n; cin >> n;
    vector<ll> a(n+1), s(n+1, 0);
    for(int i=1; i<=n; i++) {
        cin >> a[i];
        s[i] = s[i-1] + a[i];
    }
    vector<pair<ll, ll>> v; // {区间和, 区间左端点}
    for(int l=1; l<=n; l++) {
        for(int r=l; r<=n; r++) {
            v.push_back({s[r] - s[l-1], l});
        }
    }
    sort(v.begin(), v.end());
    ll ans = LLONG_MAX;
    for(int i=0; i < v.size()-1; i++) {
        // 检查v[i]和v[i+1]对应的区间是否重叠
        // 我们需要知道区间的右端点。已知左端点l和区间和sum,但无法直接得到r。
        // 一个近似方法是:如果两个区间和相差很大,或者左端点相距很远,它们很可能不重叠。
        // 更稳妥但低效的方法是记录右端点。
        // 更好的做法:存储三元组 {区间和, 左端点, 右端点}
    }
    cout << ans << endl;
    return 0;
}

原始文章中的代码尝试通过区间和除以左端点值来估算右端点,这种方法并不严谨,在某些情况下会出错。更正确的做法是在生成所有区间时,同时记录右端点 r。然后在排序后检查相邻区间对 (l1, r1) 和 (l2, r2) 是否满足 r1 < l2 或 r2 < l1(即不相交)。这样做的复杂度是 O(n^2 log n),对于 n=1000 左右的数据是可行的。如果n更大,可能需要更优的解法,例如使用二分查找或者双指针。这道题考察的是对前缀和的灵活运用,以及通过排序来优化最值搜索的技巧。

2024年第十五届蓝桥杯大赛软件类省赛C/C++大学B组真题 打卡最后一个半月第一套蓝桥杯真题。 阅读详情

相关推荐

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

本文深入解析蓝桥杯C/C++大学B组省赛真题,涵盖握手问题、小球反弹等经典题型,提供算法优化与实战技巧。通过具体代码示例,帮助参赛者掌握组合数学、动态规划等核心算法,提升竞赛成绩。

weixin_29274969的博客 1119

2024蓝桥杯省赛C/C++大学B组 题解

小蓝组织了一场算法交流会议,总共有 50 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 7 个人,这 7 人彼此之间没有进行握手 (但这 7 人与除这 7 人以外的所有人进行了握手)。请问这些人之间一共进行了多少次握手?注意 A 和 B 握手的同时也意味着 B 和 A 握手了,所以算作是一次握手。【分析】最后答案为 1204,两种思考方式C432​7×43C502​−C72​。

爱思考的小伙 3512

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

本文深度解析2024年蓝桥杯C/C++大学C组省赛真题,涵盖‘拼正方形’、‘数字诗意’、‘回文数组’等核心题目。通过剖析数学思维、枚举规律、排序优化、贪心策略及前缀和/差分等关键技巧,提供实战代码与优化思路,旨在帮助参赛者掌握解题方法,提升算法竞赛能力。

weixin_29006187的博客 375

2024年第十五届蓝桥杯省赛大学生C++B组题解&个人感受

作者水平一般~~,写博客是为了记录自己的刷题过程来帮助自己以后复习1、整体难度不大,编程题打暴力几乎都可以拿一些分,除了基础算法偏多,锻炼思维能力2、一定要记住 开啊~~ 大部分题不开都会爆int的,忘了两次(┭┮﹏┭┮3、该暴力的题一定要暴力,C题和G题都是直接的暴力题,没有那么多限制~~4.这个可重复集合的数据结构该用到的时候一定不要忘记qwq。

python_yyd的博客 2965

蓝桥杯C/C++大学C组真题解析:2024年省赛核心考点与解题技巧

本文深入解析2024年蓝桥杯C/C++大学C组省赛真题,涵盖基础题型、算法优化和数据结构应用等核心考点。通过具体题目如拼正方形、回文字符串等案例,详细讲解解题技巧与常见错误,帮助参赛者提升编程能力和竞赛成绩。

weixin_30825581的博客 410

蓝桥杯备赛避坑指南:从省赛真题解析常见策略失误

本文深入解析蓝桥杯省赛C/C++大学B组真题中的常见策略失误,提供赛题特征分析、时间分配法则、代码模板应用等实用技巧。通过真题案例揭示算法优化路径,帮助参赛者有效避坑,提升竞赛成绩。特别针对DFS、动态规划等高频考点给出标准化解决方案。

weixin_29306011的博客 324

【第15届蓝桥杯C/C++B组省赛】试题&参赛经历&经验&个人题解

​ 蓝桥杯结束了,学了这么久的算法,虽然写的不是特别好,大多都是直接暴力,但是希望能进国赛吧。现在是2024年9月22日20:43:28,距离4月份参加完省赛已经过了5个月,当时参加省赛的代码我在官网上模拟自测了一下,得分为70(满分150),这些代码虽然写的一坨,但是在四川省b组也能拿省一等奖进国赛,甚至当时的排名还比较靠前,希望对后续参加蓝桥杯的同学有所帮助。​ 本来想用哈希表来剪枝,不知道为什么当时没写出来,一直报错,devc++我又不知道哪里错了,没办法 反正也是骗分,直接暴力了。

ylxc_tu的博客 1万+

蓝桥杯国赛C/C++真题拆解:从环境配置到算法建模

C/C++编程竞赛中的算法题解,本质是将现实约束转化为可计算模型的过程。理解动态规划的状态定义、博弈论的SG函数建模、字符串替换的贪心边界,离不开对编译环境(如GCC 8.3)、内存布局与标准库行为的底层认知。VS Code配置c/c++环境、edit configurations(json)不弹出等高频问题,暴露出开发者在构建系统、调试流程与跨平台兼容性上的能力断层。本文聚焦蓝桥杯国赛真题实战,结合矩阵路径计数、高僧斗法、数字替换等典型题目,解析如何在4小时内完成问题拆解、模型选择、代码落地与边界验证,特

weixin_34128839的博客 443

【蓝桥杯B组】第15届蓝桥杯省赛C/C++B组

n人依次握手,第一个人要握(n-1)次,第二个人要握(n-2)次……两式相比,可得p/q=(dx * y)/(dy * x),即p=dx*y(约分后)。分析:设小球运动时间为t,在x轴方向运动了p个来回,在y轴方向运动了q个来回。则,x方向运动距离 2px=t * dx,y方向运动距离2py=t * dy。分析:通过标志位tag来判断x的奇数位和偶数位,循环x的每一位来进行判断。的时间复杂度为O(n),效率太低,进行优化更改(高精度算法):。将字符串d倒序存入数组中,令数组中的每一位与2相乘循环乘n次。

2302_79531041的博客 447

蓝桥杯C/C++省赛备赛指南:从A/B/C组试题拆解到VSCode调试环境搭建

算法竞赛备赛的核心在于理解题型梯度与掌握调试工具。蓝桥杯C/C++省赛按A/B/C组划分难度,C组侧重基础语法与模拟,B组引入搜索与动态规划,A组则涉及数据结构与图论综合题。备赛的关键不是盲目刷题,而是建立可复现的工程化流程:配置本地编译调试环境、按考点归类模板、利用重定向与对拍验证边界。VSCode配合g++和gdb可实现一键编译调试,通过tasks.json与launch.json定制评测参数,再用freopen重定向模拟标准输入输出,能显著提升刷题效率与赛场稳定性。

weixin_30231327的博客 47

OC5021B 100V宽电压输入 LED车灯/大功率照明 DC降压型恒流驱动器

适用于LED大功率汽车大灯/大功率照明 OC5021B 100V宽电压输入 5A电流设计 DC-DC降压型恒流驱动IC

Handsome63841990的博客 2420

2024年十五届蓝桥杯省赛大学B组真题(Java残缺版)

2024年十五届蓝桥杯省赛大学B组真题(Java完整版)题解

2302_76207485的博客 1万+

省三医院新门诊大楼网络安全建设项目实施方案

为了响应国家建设数字医疗,构建医联网、医共体的号召,新门诊大楼现有计算机网络,实现各门诊室、药房、医学影像科室及后勤科室的终端数据互通。在互联网出口以三层模式部署两台防火墙,作为连接公网的出口设备;出于等保合规和自身业务安全的考虑,现需要该网络上通过网络安全设备实现安全建设。公网出口防火墙,配置攻击防御策略,防御互联网上的病毒进入内网。公网出口防火墙配置攻击防御策略,防御外网对内网的入侵行为。服务器取得边界防火墙,配置攻击防御策略,入侵防御策略。公网出口防火墙配置入侵防御策略,防御外网对内网发起的D。

m0_63645854的博客 2016

第十四届蓝桥杯大赛软件赛省赛(Python大学A组)

2023年蓝桥杯省赛真题Python大学A组。

w2563216521的博客 1万+

在 CentOS Stream 10 上搭建 Kubernetes 集群并支持开发调试与日志查看

搭建 Kubernetes 集群的每个步骤详细的文档。

灵犀物润 1646

Sigrity SystemSI仿真分析教程文件路径

为了方便读者能够快速上手和学会Sigrity SystemSI 的功能,将Sigrity SystemSI仿真分析教程专栏所有文章对应的实例文件上传至以下路径。

weixin_54787054的博客 715

《蓝桥杯算法入门》(C/C++、Java、Python三个版本)24年10月出版

蓝桥杯大赛软件类入门书,有三种语言的版本:C/C++、Java、Python。

罗勇军的博客 1万+

基于Verilog的8位CPU设计及UART扩展实现方案,包含完整的架构设计、核心代码实现和仿真验证方法

基于Verilog的8位CPU设计及UART扩展实现方案,包含完整的架构设计、核心代码实现和仿真验证方法

a_zxswer的博客 192

蓝桥杯C/C++B组省赛实战指南:算法与工程细节双通关

C/C++编程能力是计算机基础工程能力的核心体现,涉及内存管理、编译器兼容性、底层数据结构实现等关键原理。掌握标准C/C++不仅支撑算法逻辑落地,更决定代码在真实受限环境(如Dev-C+++GCC 4.9.2)中的可运行性与稳定性。其技术价值在于 bridging 算法设计与工业级代码交付之间的鸿沟,广泛应用于竞赛刷题、嵌入式开发、OJ系统调试及国赛进阶等场景。本文聚焦蓝桥杯C/C++B组省赛真实考题与踩坑经验,深度解析DFS状态设计、动态规划滚动优化、时间感知图算法等高频考点,结合GCC 4.9.2兼容性

weixin_30820077的博客 633

关闭搜狗输入法右下角广告的解决方案

本文主要介绍了关闭搜狗输入法右下角广告的解决方案,希望能对使用搜狗输入法的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

YOLOv8改进 | Conv篇 | 利用YOLOv9的GELAN模块替换C2f结构(附轻量化版本 + 高效涨点版本 + 结构图)

本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的GELAN模块来改进YOLOv8中的C2f,GELAN融合了CSPNet和ELAN机制同时其中利用到了RepConv在获取更多有效特征的同时在推理时专用单分支结构从而不影响推理速度,同时本文的内容提供了两种版本一种是参数量更低涨点效果略微弱一些的版本(参数量V8n下降80w,计算量为6.1GFLOPs),另一种是参数量稍多一些但是效果要不参数量低的效果要好一些(均为我个人整理),提供两种版本是为了适配不同需求的读者,具体选择

Snu77的博客 7568

蓝桥杯备赛全攻略:教学资料+真题解析+项目实战+经验心得

蓝桥杯备赛指南摘要 2025年蓝桥杯软件赛分为研究生组、大学A/B/C组,按学历报名。比赛包含省赛和全国决赛,4小时赛程,题型分结果填空题(5-6题)和编程大题(4-5题),总分150分。考查重点为算法与数据结构,包括枚举、动态规划、搜索、数论等核心内容,推荐使用C/C++语言。 备赛资源包括: 官方资料(真题、大纲、云课) 经典教材(算法入门、真题解析) B站免费课程(零基础到进阶) 刷题平台(官网题库、洛谷专题) 高频考点解析提供枚举、动态规划、数论、搜索和字符串处理的代码示例,帮助针对性训练。

1585

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

2024蓝桥杯真题解析:从场景抽象到算法实战的备赛指南

算法竞赛的核心在于将现实问题抽象为数学模型,并运用高效的数据结构与算法求解。动态规划通过状态定义与转移方程解决最优子结构问题,而搜索算法(如DFS、BFS)则用于遍历解空间或寻找最短路径。这些技术在工程实践中价值显著,例如在路径规划、资源调度等场景中实现优化。近年来,赛事题目更注重与真实场景结合,如“校园美食家”需在时间约束下最大化满意度,这要求选手从生活化描述中抽象出图论模型,并可能运用状态压缩动态规划求解。同时,“智能小车”类题目融合了搜索与控制逻辑,考察系统思维与路径回溯能力。掌握场景抽象方法与核心算

weixin_33724059的博客 1117

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

第十四届蓝桥杯大赛软件赛国赛Java大学C组(部分)

摘要:本文包含四个编程题解:1)计算2023年小蓝跑步总距离(含日期判断);2)统计1-100万区间内的混乘数字数量(满足特定乘法条件);3)计算整数逐位减和归零所需时间;4)解析SimpleCron表达式并计算2023年执行次数。所有题目均采用Java实现,涉及日期处理、数字运算和字符串解析,要求输出整数结果。每道题目均给出了完整代码思路和运行限制条件。

wlkq的博客 1744

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: ArcGIS+ENVI处理水文遥感数据的5个避坑技巧:以甘肃省冰湖分布为例
下一篇: ANSYS RedHawk:集成电路电源与信号完整性分析的终极解决方案
java5
博客等级 码龄22年 85粉丝 2103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值