2025年01月蓝桥杯STEMA选拔赛C++真题

T1 购买苹果

题目描述

每箱苹果价值n元,购买m箱苹果,需要多少钱。

输入格式

输入两个整数n和m(1≤n≤50,1≤m≤100),分别表示每箱苹果的价格及购买苹果的箱数,整数之间以一个空格隔开。

输出格式

输出一个整数,表示购买m箱苹果需要的钱数。

输入输出样例 #1

输入 #1

10 30

输出 #1

300
#include<iostream>
using namespace std;

int main(){
	// T1 购买苹果
    int n,m;
    cout << n * m << endl;
    
	return 0;
} 

T2 分南瓜

题目描述

农场有3块农田,每块农田有若干个南瓜,小夏希望将每块农田的南瓜分成两份,要求每份中的南瓜数量均为奇数。请帮助小夏逐一判断每块农田中南瓜的数量能否满足要求。

例如:3块农田中南瓜的数量依次为6,8,7;
第1块农田中南瓜数量为6,可以分为3和3两份,均为奇数,满足条件;
第2块农田中南瓜数量为8,可以分为1和7两份,均为奇数,满足条件;
第3块农田中南瓜数量为7,无论如何分配,都无法确保两份南瓜的数量均为奇数,因此不满足条件。

输入格式

一行输入3个整数(2≤整数≤500),分别表示每块农田中南瓜的数量,整数之间以一个空格隔开。

输出格式

输出3个整数,依次表示对应农田中南瓜的数量是否满足分配要求,如果满足输出1,否则输出0,整数之间以一个空格隔开。

输入输出样例 #1

输入 #1

6 8 7

输出 #1

1 1 0  
#include<iostream>
using namespace std;

int main(){
    // T2 分南瓜
    // 思路一
    int ans[3] = {0};
    
    for(int i = 0;i < 3;i++){
        int num;
        cin >> num;
        for(int j = 1;j <= num;j++){
            int k = num - j;    //遍历差值,判断奇数
            if(j % 2 != 0 && k % 2 != 0){
                ans[i] = 1;
                break;
            }
        }
    }
    
    for(int i = 0;i < 3;i++){
        cout << ans[i] << " ";
    }

    // 思路2:奇偶性和差规则:同则偶,异则奇。
    int a,b,c;
    cin >> a >> b >> c;
    
    int ansA = a % 2 == 0 ? 1 : 0;
    int ansB = b % 2 == 0 ? 1 : 0;
    int ansC = c % 2 == 0 ? 1 : 0;
    
    cout << ansA << " " << ansB << " " << ansC << endl;

	return 0;
} 

T3 超级幸运数

题目描述

乐乐有两个幸运数字,分别是 4 和 7。如果一个整数满足以下两个条件中的任意一个,乐乐就会称其为超级幸运数。条件如下:
1)整数中各数位上的数字都是幸运数字,例如4、47、444;
2)整数中数位上所包含的所有幸运数字的总数是幸运数字,例如414177(其中包含了2个4和2个7,共有4个幸运数字)。
给定n个整数,请判断其中有多少个超级幸运数。

例如:n = 3,3个整数分别为74、417、40444444:
整数74是超级幸运数,因为数位上的7和4都是幸运数字,满足条件1;
整数417不是超级幸运数,因为数位中1不是幸运数字,不满足条件1,且数位中幸运数字的总数是2,2不是幸运数字,不满足条件2;
整数40444444是超级幸运数,因为40444444的数位中幸运数字的总数是7,7是幸运数字,满足条件 2;
综上所述,共有2个超级幸运数。

输入格式

第一行输入一个整数n(1≤n≤1000);
第二行输入n个整数(1≤整数≤10³*³),整数之间以一个空格隔开。

输出格式

输出一个整数,表示超级幸运数的数量。

输入输出样例 #1

输入 #1

3
74 417 40444444

输出 #1

2
#include<iostream>
using namespace std;

int main(){
    // T3 超级幸运数字
    int n,ans = 0;
    cin >> n;
    
    for(int i = 0;i < n;i++){
    	int num;
        cin >> num;
        
        int lukCnt = 0;     //幸运数字的个数
        bool allLukNum = true;      //默认全部是幸运数字
        
        while(num != 0){
            int digit = num % 10;    //数字拆解思路:通过%10,/10进行处理
            if(digit == 4 || digit == 7){
                lukCnt++;
            }else{
                allLukNum = false;
            }
            num = num / 10;
        }
        
        if(allLukNum || lukCnt == 4 || lukCnt == 7){  //数字全是4和7,或者幸运数字总和达到4或者7
            ans++;
        }
    }

    cout << ans << endl;

	return 0;
} 

T4 单词验证

题目描述

小丁在学习英语单词时发现,某些单词如果删除若干字母后(不改变剩余字母的顺序)可得到另一个单词。
现有N组数据,每组数据中给定两个仅包含小写字母的字符串,表示初始单词s和目标单词t,请判断对于每组数据,能否从s中删除零个或多个字母得到t,如果能得到输出"YES",否则输出"NO"。

例如:
N = 2,两组数据如下:
1)s = “adventure”,t = “avenue”,删除"adventure"中的第2、6、8个字母可得到"avenue",故输出YES;
2)s = “good”,t = “no”,无论怎么删除都无法得到t,故输出NO。

输入格式

第一行输入一个正整数N(1≤N≤1000),表示数据组数;
接下来N行,每行输入两个仅包含小写字母的字符串,分别表示初始单词s(1≤s的长度≤500)和目标单词t(1≤t的长度≤500),字符串之间以一个空格隔开。

输出格式

共N行,每行输出一个字符串,如果能从初始单词s中删除零个或多个字母得到目标单词t,输出"YES",否则输出"NO"。

输入输出样例 #1

输入 #1

2
adventure avenue
good no

输出 #1

YES
NO
#include<iostream>
#include<string>
using namespace std;

int main(){
    // T4 单词验证
    int n;
    cin >> n;
    string ans[n];

    for(int i = 0;i < n;i++){
        string s,t;
        cin >> s >> t;

        /*
            使用两个指针,分别指向s和t的开头
            遍历s和t,如果s[j] == t[k],则k向后移动(表示匹配了一个字符)。
            最终如果k移动到t的末尾,说明t是s的子序列,输出YES;否则输出NO。
        */
        
        int j = 0,k = 0;
        int sLen = s.length(),tLen = t.length(); 
        
        while(j != sLen){     
            if(s[j] == t[k]){
                k++;
            }
            j++;
        }
        if(k == tLen){        
            ans[i] = "YES";
        }else{
            ans[i] = "NO";
        }
    }

    for(int i = 0;i < n;i++){
        cout << ans[i] << endl;
    }

	return 0;
} 

T5 小球的重量

题目描述

有n个小球,编号为1到n,所有小球的重量均不相等。
按照编号顺序,依次给出1到n - 1号小球与其他小球的重量比较关系(<表示小于,>表示大于)。
请找出重量第k大的小球,并输出其编号。

例如:n = 4,有4个小球,比较关系如下:
1号小球与2、3、4号小球的重量比较关系:小于2号,小于3号,大于4号;用"< < >“表示。
2号小球与3、4号小球的重量比较关系:大于3号,大于4号;用”> >“表示。
3号小球与4号小球的重量比较关系:大于4号;用”>"表示。
根据上述比较关系可得,按照重量由大到小排序后小球的编号分别为:2、3、1、4;
当k = 3时,重量第3大的小球编号为1。

输入格式

共n + 1 行;
第一行输入一个整数n(1≤n≤2000),表示小球的数量;
第二行输入n - 1个字符,字符为’>’或’<‘,依次表示1号小球与2、3、…、n号小球的重量比较关系;
第三行输入n - 2个字符,字符为’>‘或’<‘,依次表示2号小球与3、4、.·、n号小球的重量比较关系;

第n行输入1个字符,字符为’>‘或’<',表示n - 1号小球与n号小球的重量比较关系;
以上输入中,同一行字符之间以一个空格隔开;
第n + 1行输入一个整数k(1≤k≤n)。

输出格式

输出一个整数,表示重量第k大的小球编号。

输入输出样例 #1

输入 #1

4
< < >
> >
>
3

输出 #1

1
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

bool cmpSecond(pair<int,int> a,pair<int,int> b){
    return a.second > b.second;
}

int main(){
    // T5 小球的重量
    int n;
    cin >> n;
    vector<int> cnt(n + 1,0);   //动态数组(长度,初始值)

    for(int i = 1;i <= n;i++){
        for(int j = i + 1;j <= n;j++){
            char c;
            cin >> c;   //输入比较关系
            if (c == '>'){
                cnt[i]++;   //i比j重,i的次数加1
            }else if (c == '<') {
                cnt[j]++;   //j比i重,j的次数加1
            }
        }
    }

    int k;
    cin >> k;

    vector<pair<int,int>> balls;    //键值对
    
    for(int i = 1;i <= n;i++){
        balls.push_back({i,cnt[i]});    //将小球编号和大于次数进行配对
    }
    
    sort(balls.begin(),balls.end(),cmpSecond);   //greater<int>:降序排序,less<int>:升序排序,默认针对pair第一项排序。因此自定义cmp函数,针对第二项排序。

    // for(int i = 0;i < balls.size();i++){
    //     cout << balls[i].first << " " << balls[i].second << endl;   //键值对排序效果
    // }

    cout << balls[k - 1].first << endl;

    return 0;

} 
内容概要:本文档对2025蓝桥杯试题进行了分类整理,涵盖编程类真题、客观题与单片机专项、真题资源与学习平台以及备考建议。编程类真题包括算法与数据结构(如分巧克力问题、求和问题、天干地支等)和基础编程题(如武功秘籍、熊怪吃核桃、煤球数目等),涉及多种编程技巧与逻辑推导能力。客观题与单片机专项部分则针对数据结构、Python语法、数学基础等方面进行考察,并涵盖单片机方向的省赛真题与知识点。真题资源与学习平台介绍了官方题库、全真模拟卷、第三方平台(如Dotcpp、优快云、百度题解库)及其提供的功能。备考建议方面,提出分模块突破编程题与客观题,并推荐利用官方及第三方资源进行限时模拟与针对性练习。 适合人群:准备参加蓝桥杯竞赛的学生及编程爱好者,尤其是对编程类题目、单片机专项有一定兴趣和基础的人群。 使用场景及目标:①帮助考生熟悉蓝桥杯的出题风格和题型分布;②通过练习历真题,提升编程技能与应试能力;③利用官方及第三方平台提供的资源进行有针对性的学习与模拟测试。 阅读建议:建议考生根据自身情况,先从编程类真题入手,逐步掌握常见算法与数据结构的应用,同时结合客观题与单片机专项进行综合复习。在备考过程中,充分利用官方题库和第三方平台提供的资源,进行限时模拟测试,找出薄弱环节并加以改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值