官方题解 | 欢乐赛#71题解
2026-04-15 14:41:05
发布于:浙江
官方题解 | 欢乐赛#71题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔的逆序输出 | 入门 |
| T2 | 皓仔的期末评奖 | 入门 |
| T3 | 皓仔的字符串展开 | 入门 |
| T4 | 皓仔的矩阵匹配 | 入门 |
| T5 | 皓仔的幸运三元组 | 入门 |
| T6 | 皓仔的质数数位和 | 普及- |
T1 皓仔的逆序输出
题目大意
输入了 个整数,把这 个整数按照相反的顺序输出出来。
题解思路
定义 个整数变量 , 按顺序输入之后, 逆序输出 ,使用空格隔开即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int a,b,c,d;
cin>>a>>b>>c>>d;
cout<<d<<" "<<c<<" "<<b<<" "<<a<<endl;
return 0;
}
T2 皓仔的期末评奖
题目大意
期末考试有三门科目,分别是语文、数学、英语。现在输入这三门课的成绩,请你根据下面的规则判断最终获得的奖项:
- 如果语文、数学、英语三门成绩都大于等于 分,则获得一等奖。
- 如果没有获得一等奖,则再根据三门总分评奖:
- 总分大于等于 分,获得二等奖;
- 否则,如果总分大于等于 分,获得三等奖;
- 否则,如果总分大于等于 分,获得优秀奖;
- 否则,输出未获奖。
请你编写程序,输出最终获得的奖项。
题解思路
分支嵌套练习题: 首先定义 三个变量输入语数英三科成绩,
当三科成绩都大于等于 也就是 a >= 90 && b >= 90 && c >= 90 时, 输出 一等奖;
否则根据总分 做出判断:
- 时候,输出
二等奖 - 否则如果 ,输出
三等奖 - 否则如果 ,输出
优秀奖 - 否则输出
优秀奖
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int a,b,c,sum;
cin>>a>>b>>c;
sum=a+b+c;
if(a>=90&&b>=90&&c>=90){
cout<<"一等奖"<<endl;
}
else if(sum>=270){
cout<<"二等奖"<<endl;
}
else if(sum>=240){
cout<<"三等奖"<<endl;
}
else if(sum>=180){
cout<<"优秀奖"<<endl;
}
else{
cout<<"未获奖"<<endl;
}
return 0;
}
T3 皓仔的字符串展开
题目大意
给定一种经过压缩的的字符串,这个字符串一定由“大写字母”和“数字字符”交替组成。
其中,每一个数字字符都表示它前面那个大写字母需要重复输出多少次。
例如字符串 A3B2C4 表示:
A输出 次;B输出 次;C输出 次;
所以展开后的结果为 AAABBCCCC。
现在请你帮助皓仔输出这个字符串展开后的结果。
题解思路
定义字符串并且输入,每次要展开的内容一定是一个字母字符加上一个数字字符。
因此遍历整个字符串,每两个字符进行一次展开。需要输出的是字母字符 , 对应的次数是数字字符 。
从数字字符转化成对应的数字需要减去 '0' , 因此循环 s[i] - '0' 次输出字符 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin>>s;
for(int i=0;i<s.size();i=i+2){
for(int j=1;j<=(s[i+1]-'0');j++){
cout<<s[i];
}
}
cout<<endl;
return 0;
}
T4 皓仔的矩阵匹配
题目大意
给定两个大小相同的 矩阵,两个矩阵都有 行 列。
现在他想进行一次特殊的字符匹配。对于矩阵中的每一个位置 ,如果这个位置上的这个位置才算“匹配成功”。
将两个矩阵的匹配程度定义为匹配成功的位置在整个矩阵中的占比,
如果匹配程度大于等于给定的比值 ,则输出 YES;否则输出 NO。
请你帮助皓仔判断最终结果。
题解思路
注意题目中给定的数组是没有空格的,输入时候需要使用字符输入。
定义两个字符数组 , 在输入结束之后遍历所有的坐标 ,如果两个数组在该位置恰好相反, a[i][j] != b[i][j],则匹配成功的个数 加一。
匹配程度 等于匹配个数除以总字符个数 ,根据该数值是否大于等于阈值 来判定输出 YES 还是 NO。
参考代码
#include <bits/stdc++.h>
using namespace std;
char a[110][110];
char b[110][110];
int main() {
int n,m;
double x;
cin>>n>>m>>x;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>b[i][j];
}
}
double num=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]!=b[i][j]){
num++;
}
}
}
double ans=num/(n*m);
if(ans>=x){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
return 0;
}
T5 皓仔的幸运三元组
题目大意
给定一个长度为 的数组,现在想从中选出三个下标互不相同的位置 ,并且满足:
- 恰好等于给定的整数
如果一个三元组 满足上面的条件,那么就称它为一个“幸运三元组”。
请你问一共有多少个幸运三元组。
题解思路
注意到本题中数据范围较小,可以直接暴力枚举所有的三元组 ,并且判断该三元组是否符合题意。
三重循环嵌套分别枚举 , 注意题目中的要求是 , 因此 的枚举范围是 , 的枚举范围是 。
最后检查一下是否符合题意, 如果 恰好等于给定的整数 , 答案加一,最后输出答案。
参考代码
#include <bits/stdc++.h>
using namespace std;
int a[110];
int main() {
int n,x;
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int cnt=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
for(int k=j+1;k<=n;k++){
if(a[i]+a[j]+a[k]==x){
cnt++;
}
}
}
}
cout<<cnt<<endl;
return 0;
}
T6 皓仔的质数数位和
题目大意
如果一个数不断的将自身更改为自身的数位和,直到变成一位数为止,并且在这个过程中出现的每一个数都是质数,那么皓仔这个数为“好数”。
例如:
- ,过程中每个数都是质数,所以 是好数;
- ,最后出现了 ,不是质数,所以 不是好数。
- , 最开头出现了 , 不是质数,所以 不是好数。
现在给定两个整数 和 ,请你求出区间 中一共有多少个好数。
题解思路
枚举 范围内的所有数字,进行是否是好数的判定。
对于每个数字首先定义一个标记 flag = true ,本题中的判定需要一直持续到数字变为一位数才停下,因此可以使用 while(n >= 10) 循环, 在数组成为一位数之前不断地进行质数判断, 只要有一次判断出非质数, 则让 标记 flag = false 。如果在循环结束之后标记仍然为真,则答案加一。最终输出答案即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int l,r;
cin>>l>>r;
int ans=0;
for(int i=l;i<=r;i++){
int x=i;
int sum=0;
int flag=1;
if(x==1){
flag=0;
}
for(int j=2;j<=x/j;j++){
if(x%j==0){
flag=0;
break;
}
}
while(x>=10&&flag==1){
sum=0;
while(x!=0){
sum=sum+x%10;
x=x/10;
}
for(int j=2;j<=sum/j;j++){
if(sum%j==0){
flag=0;
break;
}
}
x=sum;
if(x==1){
flag=0;
}
}
if(flag==1){
ans++;
}
}
cout<<ans<<endl;
return 0;
}
全部评论 1
dddd
3天前 来自 广东
1



















有帮助,赞一个