2025年01月蓝桥杯STEMA选拔赛C++真题_蓝桥2025年1月真题试卷(c++
T1 购买苹果
题目描述
每箱苹果价值n元,购买m箱苹果,需要多少钱。
输入格式
输入两个整数n和m(1≤n≤50,1≤m≤100),分别表示每箱苹果的价格及购买苹果的箱数,整数之间以一个空格隔开。
输出格式
输出一个整数,表示购买m箱苹果需要的钱数。
输入输出样例 #1
输入 #1
10 30
输出 #1
300
#includeusing 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
#includeusing 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
374 417 40444444
输出 #1
2
#includeusing 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
2adventure avenuegood no
输出 #1
YESNO
#include#includeusing 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#include#includeusing 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:降序排序,less:升序排序,默认针对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;}