# 官方题解 | 欢乐赛#65题解
2026-01-21 10:21:17
发布于:浙江
官方题解 | 欢乐赛#65题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔寄快递 | 入门 |
| T2 | 皓仔的账单 | 入门 |
| T3 | 皓仔的波浪字符串 | 入门 |
| T4 | 皓仔画图 | 入门 |
| T5 | 皓仔的数字打分 | 普及- |
| T6 | 皓仔的成绩排序 | 普及- |
T1 皓仔寄快递
题目大意
寄快递的基本运费是 块钱, 在此基础上还需要根据快件的重量来额外计算运费。每千克的重量需要额外支付 元的运费,现在经过称重,皓仔的快递重量为 千克,请你帮他计算他的运费是多少?
题解思路
根据题意,可知额外运费为 , 基础运费为 元,注意本题数据范围较大,需要开 long long。
#include <bits/stdc++.h>
using namespace std;
int main(){
long long x,y;
cin>>x>>y;
cout<<5+x*y<<endl;
return 0;
}
T2 皓仔的账单
题目大意
皓仔在超市买了三类商品:单价分别为 ,数量分别为 。收银台有两种规则依次生效:
- 先满减:当总价 时立减 元(否则不减)。
- 后打折:对第一步之后的价格再打 的折(例如 表示打 折, 哪怕第一步没有触发满减也可以打折)。
题解思路
本题首先需要计算优惠前的总价格 sum=a*x+b*y+c*z , 在此基础上按照题目给出的要求分两步走:
首先是先判断是否可以满减,当 sum >= m 时候,令 m -= d。
而后进行打折操作,打 的折也就是让价格乘以(100-p)/100。
最终使用printf输出答案即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main(){
double a,b,c,x,y,z,m,d,p;
cin>>a>>b>>c>>x>>y>>z>>m>>d>>p;
double sum=a*x+b*y+c*z;
if(sum>=m){
sum=sum-d;
}
sum=sum*(100-p)/100;
printf("%.2lf",sum);
return 0;
}
T3 皓仔的波浪字符串
题目大意
当整个字符串的第奇数个字符都为小写,第偶数个字符都为大写,那么这就是一个波浪字符串。
现在皓仔得到了一个只由字母构成的字符串 , 你可以自由对其中的字符进行大小写的转换,请你将其修改成一个波浪字符串并且输出。
例如abcDEF转化为波浪字符串则是aBcDeF。
题解思路
使用string输入字符串之后,直接遍历整个字符串,根据下标进行判断:第奇数个字符需要为小写,第偶数个字符需要为大写。
因此当前字符是第奇数个字符,也就是下标为偶数(因为下标是从 开始的),且是大写字母的情况下,可以令ASCII码加上32,实现大写转小写。
因此当前字符是第偶数个字符,也就是下标为奇数(因为下标是从 开始的),且是小写字母的情况下,可以令ASCII码减去32,实现小写转大写。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin>>s;
int len=s.size();
for(int i=0;i<len;i++){
if(i%2==0){
if(s[i]>='A'&&s[i]<='Z'){
s[i]=s[i]+32;
}
}
else{
if(s[i]>='a'&&s[i]<='z'){
s[i]=s[i]-32;
}
}
}
cout<<s<<endl;
return 0;
}
T4 皓仔画图
题目大意
给定整数 ,输出一个 的字符图案:
- 边框全部为
# - 主对角线与副对角线为
* - 其余位置为
.
字符优先级:若同一位置既在边框又在对角线上,则输出 *(对角线覆盖边框)。
题解思路
本题需要输出一个二维图形,其中需要着重注意边框和对角线:
首先判定是否在对角线上,也就是判断i==j||i+j==n+1,是的话输出 *;
然后判断是否在边框上,也就是判断i==1||i==n||j==1||j==n,是的话输出 #;
剩余情况输出 .
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j||i+j==n+1){
cout<<"*";
}
else if(i==1||i==n||j==1||j==n){
cout<<"#";
}
else{
cout<<".";
}
}
cout<<endl;
}
return 0;
}
T5 皓仔的数字打分
题目大意
给一个 进制的数字进行打分,打分规则是这样的:
对于其中的每一个数位,如果是一个阿拉伯数字,则总分 ,
如果该数位是一个字母,则总分加上对应的 码值。
现在给皓仔提供 个 进制的数字,请你帮他计算每一个数字转化成 进制之后的打分结果。
题解思路
对于每一个数字的打分,首先先将数字转化为 进制,本题中由于不需要输出具体的 进制数,因此可以不用开数组存对应的结果。
在对当前数字 做进制转化的时候,对于每一次除以 得到的余数 ,直接判断是数字还是字母。
当 时,则该位是数字,答案 +1。
否则该位是一个字母,答案需要加上对应的 码值,也就是 。
参考代码
#include<iostream>
using namespace std;
int idx, r;
int main(){
int n;
cin >> n >> r;
while(n--) {
int x;
cin >> x;
idx = 0;
int sum = 0;
while(x) {
int c = x % r;
if(c < 10) sum ++;
else sum += 55 + c;
x /= r;
}
cout << sum << endl;
}
}
T6 皓仔的美丽子矩阵
题目大意
一场考试结束,每个学生有姓名, 年龄,平均分,学号四个信息。
请按如下优先级进行成绩单的排序:
- 按照平均分 降序 排序
- 按照年龄 升序 排序
- 按照姓名 字典序升序 排序
- 若三项关键字都相同,则按照学号进行升序排序。
题解思路
本题是一个结构体排序的模板题,由于题目中需要进行排序的学生有多个信息,因此需要使用结构体进行存储。
根据题目要求手写比较函数,函数内部的优先级按照题目要求:
先比较平均分,再比较年龄,再比较姓名,最后比较学号,其中第 个输入的同学学号就是数字 。
结构体排序成功之后直接遍历整个数组输出即可、
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct node {
string name;
int age;
double avg;
int id;
} p[100010];
bool cmp(node x, node y) {
if (x.avg != y.avg) return x.avg > y.avg;
else if (x.age != y.age) return x.age < y.age;
else if (x.name != y.name) return x.name < y.name;
else return x.id < y.id;
}
int main(){
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> p[i].name >> p[i].age >> p[i].avg;
p[i].id = i;
}
sort(p+1, p+n+1, cmp);
for (int i = 1; i <= n; i++) {
cout << p[i].name << " " << p[i].age << " " ;
printf("%.2f ", p[i].avg);
cout << p[i].id << endl;
}
return 0;
}
这里空空如也









有帮助,赞一个