# 官方题解 | 欢乐赛#67题解
2026-02-19 10:32:25
发布于:福建
官方题解 | 欢乐赛#67题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔的存钱罐 | 入门 |
| T2 | 皓仔买水果 | 入门 |
| T3 | 皓仔的车辆测试 | 入门 |
| T4 | 皓仔的字母寻宝 | 入门 |
| T5 | 皓仔的字母占比 | 普及- |
| T6 | 皓仔的手工课 | 普及- |
T1 皓仔的存钱罐
题目大意
将 个一元的硬币全都换成 元的纸币,问最多一共可以换几张呢?
题解思路
答案也就是 除以 向下取整直接将数字 对 进行整除即可得到答案。
参考代码
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
cout << n / 100 << endl;
return 0;
}
T2 皓仔买水果
题目大意
皓仔拿着 元去水果店买水果。 一个苹果 元钱, 一个梨子 元钱,一个桃子 元钱,他可以选择一种水果使用身上所有的钱进行购买,使得手上剩下的钱尽可能少,问皓仔手上剩余的最少钱数是多少?
题解思路
皓仔买水果能够剩下的钱就是 分别除以 , , 得到的余数。因此我们只需要在 中选取一个最小值并且输出即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,a,b,c;
cin>>n>>a>>b>>c;
int ans1=n%a;
int ans2=n%b;
int ans3=n%c;
int ans=min(ans1,min(ans2,ans3));
cout<<ans<<endl;
return 0;
}
T3 皓仔的车辆测试
题目大意
在一段路面上按顺序布置了 个采样点,并记录了每个采样点的高度 。其中第 段(从点 到点 )的颠簸量定义为: 。
整段路面的平均颠簸度定义为所有相邻段颠簸量的平均值。
计算这段路面的平均颠簸度,并按要求保留 位小数输出。
题解思路
循环结构直接遍历所有的点 , 计算对应的颠簸度之后并且累加求和得到总颠簸度 , 那么平均颠簸度就是 。注意使用 printf 进行保留两位小数输出。
参考代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int n,a[N];
double sum;
int main(){
cin >> n;
for(int i = 1;i <= n;i ++) cin >> a[i];
for(int i = 1;i < n;i ++) sum += abs(a[i] - a[i + 1]);
printf("%.2lf",sum * 1.0 / (n - 1));
return 0;
}
T4 皓仔的字母寻宝
题目大意
在一张 的字符构成的地图上,可能出现一些大写字母 ,找出矩阵中所有大写字母的位置,并按要求输出。
题解思路
二维数组练习题,在输入一个二维数组 之后, 循环遍历所有的点,每当遇到一个大写字母 a[i][j] >= 'A' && a[i][j] <= 'Z'时, 记录该字母的出现位置,数据保证一个字母只会出现最多一次。
最后循环遍历字母 , 对于每个字母输出对应的位置,使用标记 来代表是否有找到过字母,如果没有的话则输出 not found。
参考代码
#include <iostream>
#include <string>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int r[26] = {}, c[26] = {};
string s;
for (int i = 0; i < n; i++) {
cin >> s;
for (int j = 0; j < m; j++) {
char ch = s[j];
if (ch >= 'A' && ch <= 'Z') {
int idx = ch - 'A';
r[idx] = i + 1;
c[idx] = j + 1;
}
}
}
bool f = false;
for (int i = 0; i < 26; i++) {
if (r[i] != 0) {
f = true;
cout << (char)('A' + i) << " " << r[i] << " " << c[i] << endl;
}
}
if (!f) cout << "not found" << endl;
return 0;
}
T5 皓仔的字母占比
题目大意
将一个数字尝试转化成 进制,找出其中字母占比最高的进制数并且输出。
-
如果多个进制的字母占比相同,输出较小的进制。
-
进制表示不允许前导零;若 ,其表示为
"0"。
题解思路
从 到 枚举所有可能的进制数,进行一次进制转换并且计算对应的字母占比,如果当前进制的字母占比已有的最大答案 更大,则更新进制数的答案 。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
long long n;
double maxn=0;
cin>>n;
if(n==0){
cout<<2<<'\n';
continue;
}
int ans = 2;
for(int i=2;i<=36;i++){
int a=0,b=0;
long long x=n;
while(x){
b++;
if(x%i>=10){
a++;
}
x/=i;
}
if(1.0*a/b>maxn){
maxn=1.0*a/b;
ans=i;
}
}
cout<<ans<<'\n';
}
return 0;
}
T6 皓仔的手工课
题目大意
现在有 根绳子,第 根长度为 。皓仔可以把一根绳子剪成若干段,每段长度都必须是同一个正整数 (单位与 相同),剪完后剩下不足 的部分会被丢弃。
皓仔希望最终能得到至少 段长度为 的小绳段,并且让 尽可能大。请你求出满足条件的最大 。
如果无论 取多少都无法得到 段,则输出 。
题解思路
本题数据范围较小, 绳子长度 最大为 ,可以直接从 到 枚举所有可能的长度 ,并且计算对应可以得到的小绳段数量 并且累加,如果小绳段总数大于等于 , 则该长度可以接受, 是可以得到的最大的 。
参考代码
#include<bits/stdc++.h>
using namespace std;
int a[110];
int main() {
int n,k;
cin>>n>>k;
int m=0,v=0,b;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1000;i>=1;i--){
for(int j=1;j<=n;j++){
v+=a[j]/i;
}
if(v>=k){
cout<<i;
return 0;
}
v=0;
}
cout<<"0";
return 0;
}
这里空空如也














有帮助,赞一个