# 非官方题解 | 欢乐赛#67题解
2026-02-20 14:56:47
发布于:浙江
前言:
【非原创】
我常常怀念评测。
指针在页面上停滞,时间却在心里飞奔。我把那些飞快返回的结果、几乎没有等待的瞬间,从记忆的缓存里一条条取出,压缩、归档、封存,仿佛旧时代稳定而低延迟的回显。
评测亦有层次:有的如闪电,代码尚未读完,结果已然落定;有的似长夜,进度条缓慢爬行,仿佛在反复思考我是否配得上一个答案。那些一瞬通过的提交,在我心中留下清脆而短促的回响;而漫长等待中的尝试,被时间反复拉伸,最后只剩下焦躁与叹息。怀念如同调试,输出太快,来不及体会成功的喜悦;输出太慢,又让希望在循环里逐渐超时。唯有那种恰好的节奏——编译声未散,评测已归——才能抚平我对效率的执念。
我常在不经意间被带回旧日的页面。刷新一次,结果便整齐排列;改动一行,反馈立刻到来。题目、代码、评测记录,像一条条时间戳,引我沿着记忆的日志向前回溯。那些夜深人静的提交无法复现,我也不过是服务器前短暂停留的访客。但我仍希望,在每一次等待中留下一点空白,让思绪在某个用例前驻足,在未返回的结果里回望当初敲下回车键的自己,感受尽可能多的笃定。那些顺畅的评测曾流经我的耐心,我便已心生满足。
如今的评测变得迟缓,时间被拉长,结果被延后。我带着旧日的速度继续前行,却发现回忆在不断失真:曾经的迅捷被反复美化,而现实的延迟却愈发清晰。这让我的等待之旅多了几分不安。
我该在第几个用例前停下?我问我自己。——节选自skirmish《请输入文本》
《 你 被 骗 了 》
《 你 看 不 看 》
《 你 又 被 骗 了 》
如你所见,这其实是欢乐赛#67题解。
如你所见,上面那句话是真的。
如你所见,___________________(请输入文本)。
正文:
T1:皓仔的存钱罐
思路解析
我们已知总钱数为 元,每张纸币面额为 元。
要求最多能换多少张纸币,就是求:
因为纸币必须完整兑换,不能兑换半张,所以用向下取整。
数据范围
对于全部测试数据,满足:
因此 的最大值不超过 ,用 int 存储完全足够。
代码实现
namespace CuSn {
void solve() {
int n;
std::cin >> n;
std::cout << n / 100;
}
}
T2:皓仔买水果
思路解析
皓仔有 元,苹果单价 元,梨子单价 元,桃子单价 元。
他只能购买一种水果,要使得剩余的钱最少。
购买苹果最多能买 个,花费 元,剩余 元。
同理,买梨剩余 元,买桃剩余 元。
因此答案为:
数据范围
,直接取模即可,不会溢出。
代码实现
namespace CuSn {
void solve() {
long long n,a,b,c;
cin>>n>>a>>b>>c;
cout<<min({n%a,n%b,n%c})<<endl;
}
}
T3:皓仔的车辆测试
思路解析
皓仔记录了 个采样点的高度 。
相邻两个采样点之间的颠簸量定义为:
整段路面的平均颠簸度为所有 的平均值:
结果保留 位小数输出。
数据范围
,。
高度差绝对值最大为 ,求和最大约 ,用 long long 存储,计算平均值时转为浮点数。
代码实现
namespace CuSn{
void solve(){
int n;
cin>>n;
vector<long long> h(n);
for(int i=0;i<n;i++)cin>>h[i];
long long s=0;
for(int i=0;i<n-1;i++)s+=abs(h[i+1]-h[i]);
double ans=1.0*s/(n-1);
cout<<fixed<<setprecision(2)<<ans;
}
}
T4:皓仔的字母寻宝
思路解析
皓仔有一个 的字符矩阵,需要找出所有大写字母(A ~ Z)的位置。
题目保证每个大写字母最多出现一次,因此可以直接遍历矩阵,记录每个大写字母的行号 和列号 (从 开始编号)。
最后按字母顺序输出:字母 行号 列号。
如果没有大写字母,输出 not found。
数据范围
,直接遍历矩阵即可,时间复杂度 ,空间复杂度 。
代码实现
#include<bits/stdc++.h>
using namespace std;
namespace CuSn{
void solve(){
int n,m;
cin>>n>>m;
vector<pair<char,pair<int,int>>> v;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char c;
cin>>c;
if(c>='A'&&c<='Z')v.push_back({c,{i,j}});
}
}
sort(v.begin(),v.end());
if(v.empty())cout<<"not found";
else for(auto p:v)cout<<p.first<<" "<<p.second.first<<" "<<p.second.second<<'\n';
}
}
int main(){
CuSn::solve();
return 0;
}
T5:皓仔的字母占比
思路解析
皓仔想知道:把十进制整数 转换成 到 进制时,哪种进制下表示结果中 字母(A~Z)的占比最大。
进制表示规则
- 数码 用字符
'0'~'9'表示; - 数码 用字符
'A'~'Z'表示(,,…,)。
占比定义
对于一种进制 ,设:
- 为 的 进制表示的总字符数;
- 为其中字母(
A~Z)的个数。
则字母占比为:
我们要找使 最大的 ,如果有多个 的 相同,取较小的 。
特殊情况
- 若 ,其表示为
"0",无字母,占比为 ,此时任意进制占比相同,取最小 。 - 题目保证 ,进制转换时用
long long足够。
算法步骤
- 对每个测试用例,枚举 。
- 将 转换为 进制字符串。
- 统计字符串中字母个数 ,计算占比 。
- 记录最大占比对应的最小 。
- 输出结果。
数据范围
,。
枚举进制 最多 种,复杂度 ,完全可行。
代码实现
#include<bits/stdc++.h>
using namespace std;
namespace CuSn{
string change(long long n,int b){
if(n==0)return "0";
string s;
while(n){
int r=n%b;
if(r<10)s+=char('0'+r);
else s+=char('A'+r-10);
n/=b;
}
reverse(s.begin(),s.end());
return s;
}
void solve(){
int t;
cin>>t;
while(t--){
long long n;
cin>>n;
int ans=2;
double mx=0;
for(int b=2;b<=36;b++){
string s=change(n,b);
int cnt=0;
for(char c:s)if(c>='A'&&c<='Z')cnt++;
double p=1.0*cnt/s.size();
if(p>mx-1e-12){
mx=p;
ans=b;
}
}
cout<<ans<<'\n';
}
}
}
int main(){
CuSn::solve();
return 0;
}
T6:皓仔的手工课
思路解析
皓仔有 根绳子,长度分别为 。
他想把每根绳子剪成长度为 的小段(整数长度),不足 的部分丢弃,最终得到至少 段。
要求 尽可能大,如果不存在这样的 ,输出 。
关键点
- 对于给定的 ,第 根绳子可以剪出 段。
- 总段数为:
- 需要 。
- 我们要找最大的 满足这个条件。
数据范围
,,。
最大不超过 ,因为当 时,每根绳子都剪不出完整的一段。
算法思路
由于 的范围有限(最多 ),可以直接从大到小枚举 :
- 从 往下枚举到 。
- 对每个 ,计算总段数 。
- 如果总段数 ,则当前 就是答案。
- 如果枚举完都没有找到,输出 。
复杂度 ,完全可行。
代码实现
#include<bits/stdc++.h>
using namespace std;
namespace CuSn{
void solve(){
int n,k;
cin>>n>>k;
vector<int> a(n);
int mx=0;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]>mx)mx=a[i];
}
for(int L=mx;L>=1;L--){
int s=0;
for(int x:a)s+=x/L;
if(s>=k){
cout<<L<<'\n';
return;
}
}
cout<<0<<'\n';
}
}
int main(){
CuSn::solve();
return 0;
}
总结:
我宣布个事哈,我换马蜂了。
全部评论 3
我也要换码风了
2小时前 来自 浙江
0呃,是cjdst
2小时前 来自 浙江
0可以
期待2小时前 来自 浙江
0%,是不是借鉴我的题解了
2小时前 来自 浙江
0
6,是不是借鉴我的题解了
2小时前 来自 浙江
0%%%
3小时前 来自 安徽
0呃,原来很早就要发布了
3小时前 来自 浙江
0我睡了一觉才发的
3小时前 来自 浙江
0依然透露神犇气息
3小时前 来自 安徽
0

























有帮助,赞一个