========================================================================
答案和更多内容请查看网站:【试卷中心 -----> 各校卷题 ----> C++ ----> 二级】
青少年软件编程历年真题模拟题实时更新
========================================================================
2025年粤港澳青少年信息学创新大赛 C++小学组复赛真题
一、编程题
第 1 题
题目描述
小明在学习数字魔术,他有一个三位数的魔术数字。作为魔术师助手,你需要帮他重新排列这个数字的三个数位,创造出可能的最小数字。重新排列后的数字可以是一位数、两位数或三位数,但展示时不能有前导零。
输入格式
输入第一行包含一个整数 n,表示这个三位数数字(保证是一个合法的三位数,即不含前导零)。
输出格式
输出一行包含一个整数,表示最小的数字,并且这个数字不应该包含前导0。
样例 1
输入
213
输出
123
样例 2
输入
203
输出
23
说明
对于 20\%的数据,n 的三位数字本身就是从小到大排序的。
对于 40\%的数据,n的三位数字中不包含 0。
对于100\%的数据,n是一个三位数。
参考答案:
#include <bits/stdc++.h>
using namespace std;
int n, k, ar[10];
void solve() {
cin >> n; // 读取三位数
k = 0; // 重置k,清空之前的数据
memset(ar, 0, sizeof(ar)); // 清空数组
// 将数位依次存入 ar[1..3]
while (n) {
ar[++k] = n % 10; // 从低位开始取
n /= 10;
}
sort(ar + 1, ar + 1 + k); // 对 ar[1], ar[2], ar[3] 进行升序排序
// 直接按"百位*100 + 十位*10 + 个位"的方式输出
// cout 输出整数时,会自动去掉高位的 0
// 例如 ar = {0,2,3} 时:0*100 + 2*10 + 3 = 23,符合题意
if (k == 1) {
cout << ar[1];
} else if (k == 2) {
cout << ar[1] * 10 + ar[2];
} else if (k == 3) {
cout << ar[1] * 100 + ar[2] * 10 + ar[3];
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}
第 2 题
题目描述
小红收集了 n颗神奇的能量宝石,每颗宝石可能是正能量宝石(红色)或负能量宝石(蓝色)。当一颗红色宝石和一颗蓝色宝石的能量值绝对值相等时,它们可以配对产生强大的能量波。
小红想知道她有多少种不同的宝石配对方案可以产生能量波?
注意:能量值为0的宝石不能与其他能量值为非0的宝石配对,但可以与其他能量值为0的宝石配对。
输入格式
第一行包含一个整数 n,表示能量宝石数量。第二行包含 n 个整数,分别表示每个能量宝石的能量值,为了方便表示,正能量宝石的能量值用正数表示,负能量宝石的能量值用负数表示。(0能量宝石是0)
输出格式
输出包含一个整数,表示小红的可选择方案数量。
样例 1
输入 1
7
1 1 -1 -1 2 0 0
输出 1
5
样例 2
输入 2
10
1 2 1 -2 -1 2 -2 1 -1 2
输出 2
12
说明
样例1解释
以下用输入的顺序编号表示选择的宝石,方案为:(1, 3), (1, 4), (2, 3), (2, 4), (6, 7)。
参考答案:
#include <bits/stdc++.h>
using namespace std;
/* 全局常量和变量 */
const int N=3e2+10; // 假设能量值的绝对值不会超过 100
long long n, cnt[N]; // cnt[i] 用来记录能量值映射后的出现次数
void solve() {
cin>>n;
// 读取 n 个能量值并分类计数
for (int i=1; i<=n; ++i) {
int x;
cin>>x;
if (x>=0)
cnt[x]++; // 非负值直接用下标 x 计数
else
cnt[100+abs(x)]++; // 负值映射到 100+|x|
}
// 先统计零值宝石两两配对的方案数
// cnt[0] 为能量值 0 的宝石数
long long ans=cnt[0] * (cnt[0] -1) /2;
// 再统计所有正负值绝对值相等的配对数
// 正值 v 在 cnt[v],负值 -v 在 cnt[v+100]
for (int v=1; v<=100; ++v) {
ans+=cnt[v] * cnt[v+100];
}
cout<<ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}
========================================================================
答案和更多内容请查看网站:【试卷中心 -----> 各校卷题 ----> C++ ----> 二级】
青少年软件编程历年真题模拟题实时更新
========================================================================