# 官方题解 | 欢乐赛#68题解
2026-03-11 07:12:25
发布于:浙江
官方题解 | 欢乐赛#68题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔的金字塔 | 入门 |
| T2 | 皓仔的偏科判定 | 入门 |
| T3 | 皓仔的回文徽章 | 入门 |
| T4 | 皓仔的蛇形数据分析 | 入门 |
| T5 | 皓仔的字母定位 | 普及- |
| T6 | 皓仔的数位排序 | 普及- |
T1 皓仔的金字塔
题目大意
按照输出样例, 输出一个 行的金字塔。
题解思路
输出四行,使用 endl 进行换行即可。
参考代码
#include<iostream>
using namespace std;
int main(){
cout<<" *"<<endl;
cout<<" ***"<<endl;
cout<<" *****"<<endl;
cout<<"*******"<<endl;
return 0;
}
T2 皓仔的偏科判定
题目大意
给定语文和数学两科的成绩,分别记为 与 ,取两科中的较高分 与较低分 ,计算比例 。
现在给定阈值 ,当 时,认为皓仔偏科,输出 YES;否则输出 NO。
题解思路
根据题意,使用较大值除以较小值得到分数的比例 ,计算的公式为 1.0*max(c,m)/min(c,m),此处为了转化为小数除法因此将式子乘以 1.0 。而后使用分支结构,当 时,,输出 YES;否则输出 NO。
参考代码
#include <bits/stdc++.h>
using namespace std;
int c,m;
double t,r;
int main(){
cin>>c>>m>>t;
r=1.0*max(c,m)/min(c,m);
if (r>=t){
cout<<"YES";
}
else {
cout<<"NO";
}
return 0;
}
T3 皓仔的回文徽章
题目大意
给定一个字符串,皓仔希望最终的字符串满足以下规则:
- 左半部分的每个字符都必须是大写字母。
- 右半部分的每个字符都必须是小写字母。
- 将整串忽略大小写后,字符串是一个回文串。也就是说在忽略大小写的情况下,对任意 ,都有 。
皓仔可以进行若干次修改操作:每次可以把字符串中的某一个位置的字符改成任意一个英文字母(可以是大写或小写)。
问至少需要修改多少个字符,才能让字符串满足以上全部规则。
题解思路
题目给定的要求,是以回文的形态成对出现的,也就是对于 ,需要考虑 和 之间的关系。对于这一对字符,需要产生的修改操作次数可以这样计算:
1、 当左边的字符不是大写字母时,一定需要进行一次修改。
2、 当右边的字符不是小写字母时,一定需要进行一次修改。
3、如果左边字符本就是大写,且右边字符本就是小写的情况下,根据字母种类是否一致考虑是否需要进行一次修改。
遍历整个字符串,判定修改次数后输出。
参考代码
#include<bits/stdc++.h>
using namespace std;
string s;
int n,sum=0;
int main() {
cin>>s;
n=s.size()-1;
for(int i=0;i<=n/2;i++){
bool f=0;
if(s[i]<'A'||s[i]>'Z'){
sum++;
f=1;
}
if(s[n-i]<'a'||s[n-i]>'z'){
sum++;
f=1;
}
if((s[n-i]-s[i])!=('a'-'A')&&f==0){
sum++;
}
}
cout<<sum;
return 0;
}
T4 皓仔的蛇形数据分析
题目大意
根据题目给出的遍历顺序对二维矩阵进行蛇形读取,把蛇形读取得到的长度为 的序列记为 。如果对任意 都满足 ,则称该表格“蛇形严格递增”。
现在给你多组测试数据,请你判断每组表格是否蛇形严格递增。若是输出 YES,否则输出 NO。
题解思路
二维数组练习题,可以考虑按照行号的奇偶性来决定遍历的顺序并且判断单调性,也可以提前把偶数行所有的数据进行反转,此处可以直接使用reverse函数进行翻转。
而后按顺序遍历所有数字, 使用变量 记录上一次访问的数字,只要数字始终严格大于 从而保持单调性则输出 YES,否则输出 NO。
参考代码
#include <bits/stdc++.h>
using namespace std;
const int N=505;
int t,n,m;
int a[N][N];
int main(){
cin>>t;
while (t--){
cin>>n>>m;
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
cin>>a[i][j];
}
if (i%2==0){
reverse(a[i]+1,a[i]+m+1);
}
}
int last=-2e9;
bool f=1;
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
if (a[i][j]<=last){
f=0;
}
last=a[i][j];
}
}
if (f){
cout<<"YES\n";
}
else {
cout<<"NO\n";
}
}
return 0;
}
T5 皓仔的字母定位
题目大意
将一个十进制数 转换成 进制表示,问在转换后的表示中,所有字母()出现的位置有哪些。
位置从右到左从 开始编号。请你把所有出现字母的位置收集起来,按从小到大输出。
- 如果没有任何字母出现,则输出
not found。
题解思路
进制转换模板题。
可以直接进行进制转换,使用一个变量 来记录当前的位置编号,如果当前这一位是一个字母,也即是说当前这一位的数字是大于 的,那么可以直接输出当前的位置。
题目要求在没有出现字母的情况下输出 not found,因此可以使用一个变量 用来判断是否输出过字母,如果没有输出过则输出 not found。
参考代码
#include<bits/stdc++.h>
using namespace std;
int n,r;
int main() {
long long n,r,ans=0;
cin>>n>>r;
bool f=0;
while(n>0){
int x=n%r;
if(x>9){
cout<<ans<<" ";
f=1;
}
ans++;
n=n/r;
}
if(!f) cout<<"not found";
return 0;
}
T6 皓仔的数位排序
题目大意
本题需要对一个整数数组排序,排序规则如下:
- 位数为奇数的数字放在左边;
- 位数为偶数的数字放在右边;
- 左边(位数为奇数)的数字按数值升序排列;
- 右边(位数为偶数)的数字按数值降序排列。
请你输出按上述规则排序后的数组。
题解思路
本题中的排序规则较为复杂,可以考虑使用结构体排序来完成。
我们需要在结构体中记录每一个数据的数值以及位数,而后根据排序规则编写自定义的比较函数 cmp 。
cmp 函数比较时候的优先级如下:
第一优先级为位数的奇偶性;
第二优先级为奇偶性一致的情况下,奇数使用升序排序,偶数使用降序排序。
最后直接 sort 排序并且输出即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
struct node{
int num;
int len;
}a[200010];
bool cmp(node x,node y){
if( (x.len%2) != (y.len%2) ){
return (x.len%2)>(y.len%2);
}
else{
if(x.len%2==1){
return x.num<y.num;
}
else{
return x.num>y.num;
}
}
}
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].num;
a[i].len=0;
int m=a[i].num;
do{
a[i].len++;
m=m/10;
}while(m!=0);
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
cout<<a[i].num<<" ";
}
cout<<endl;
return 0;
}
全部评论 5
1
4天前 来自 河南
01
1周前 来自 广东
05
1周前 来自 广东
03245
1周前 来自 浙江
0qp
1周前 来自 重庆
0






























有帮助,赞一个