前言:
> 【非原创】
> 我常常怀念评测。
> 指针在页面上停滞,时间却在心里飞奔。我把那些飞快返回的结果、几乎没有等待的瞬间,从记忆的缓存里一条条取出,压缩、归档、封存,仿佛旧时代稳定而低延迟的回显。
> 评测亦有层次:有的如闪电,代码尚未读完,结果已然落定;有的似长夜,进度条缓慢爬行,仿佛在反复思考我是否配得上一个答案。那些一瞬通过的提交,在我心中留下清脆而短促的回响;而漫长等待中的尝试,被时间反复拉伸,最后只剩下焦躁与叹息。怀念如同调试,输出太快,来不及体会成功的喜悦;输出太慢,又让希望在循环里逐渐超时。唯有那种恰好的节奏——编译声未散,评测已归——才能抚平我对效率的执念。
> 我常在不经意间被带回旧日的页面。刷新一次,结果便整齐排列;改动一行,反馈立刻到来。题目、代码、评测记录,像一条条时间戳,引我沿着记忆的日志向前回溯。那些夜深人静的提交无法复现,我也不过是服务器前短暂停留的访客。但我仍希望,在每一次等待中留下一点空白,让思绪在某个用例前驻足,在未返回的结果里回望当初敲下回车键的自己,感受尽可能多的笃定。那些顺畅的评测曾流经我的耐心,我便已心生满足。
> 如今的评测变得迟缓,时间被拉长,结果被延后。我带着旧日的速度继续前行,却发现回忆在不断失真:曾经的迅捷被反复美化,而现实的延迟却愈发清晰。这让我的等待之旅多了几分不安。
> 我该在第几个用例前停下?我问我自己。
>
> ——节选自skirmish《请输入文本》
《 你 被 骗 了 》
《 你 看 不 看 》
《 你 又 被 骗 了 》
如你所见,这其实是欢乐赛#67题解。
如你所见,上面那句话是真的。
如你所见,___________________(请输入文本)。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
正文:
T1:皓仔的存钱罐
思路解析
我们已知总钱数为 nnn 元,每张纸币面额为 100100100 元。
要求最多能换多少张纸币,就是求:
⌊n100⌋\left\lfloor \frac{n}{100} \right\rfloor ⌊100n ⌋
因为纸币必须完整兑换,不能兑换半张,所以用向下取整。
数据范围
对于全部测试数据,满足:
100≤n≤10000100 \leq n \leq 10000100≤n≤10000
因此 n/100n / 100n/100 的最大值不超过 100100100,用 int 存储完全足够。
代码实现
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
T2:皓仔买水果
思路解析
皓仔有 nnn 元,苹果单价 aaa 元,梨子单价 bbb 元,桃子单价 ccc 元。
他只能购买一种水果,要使得剩余的钱最少。
购买苹果最多能买 ⌊na⌋\lfloor \frac{n}{a} \rfloor⌊an ⌋ 个,花费 ⌊na⌋×a\lfloor \frac{n}{a} \rfloor \times a⌊an ⌋×a 元,剩余 n mod an \bmod anmoda 元。
同理,买梨剩余 n mod bn \bmod bnmodb 元,买桃剩余 n mod cn \bmod cnmodc 元。
因此答案为:
min(n mod a, n mod b, n mod c)\min(n \bmod a,\ n \bmod b,\ n \bmod c) min(nmoda, nmodb, nmodc)
数据范围
1≤n,a,b,c≤1091 \leq n,a,b,c \leq 10^91≤n,a,b,c≤109,直接取模即可,不会溢出。
代码实现
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
T3:皓仔的车辆测试
思路解析
皓仔记录了 nnn 个采样点的高度 h1,h2,…,hnh_1, h_2, \dots, h_nh1 ,h2 ,…,hn 。
相邻两个采样点之间的颠簸量定义为:
di=∣hi+1−hi∣(1≤i≤n−1)d_i = |h_{i+1} - h_i| \quad (1 \leq i \leq n-1) di =∣hi+1 −hi ∣(1≤i≤n−1)
整段路面的平均颠簸度为所有 did_idi 的平均值:
avg=∑i=1n−1∣hi+1−hi∣n−1\text{avg} = \frac{\sum_{i=1}^{n-1} |h_{i+1} - h_i|}{n-1} avg=n−1∑i=1n−1 ∣hi+1 −hi ∣
结果保留 222 位小数输出。
数据范围
2≤n≤1052 \leq n \leq 10^52≤n≤105,∣hi∣≤109|h_i| \leq 10^9∣hi ∣≤109。
高度差绝对值最大为 2×1092 \times 10^92×109,求和最大约 2×10142 \times 10^{14}2×1014,用 long long 存储,计算平均值时转为浮点数。
代码实现
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
T4:皓仔的字母寻宝
思路解析
皓仔有一个 n×mn \times mn×m 的字符矩阵,需要找出所有大写字母(A ~ Z)的位置。
题目保证每个大写字母最多出现一次,因此可以直接遍历矩阵,记录每个大写字母的行号 iii 和列号 jjj(从 111 开始编号)。
最后按字母顺序输出:字母 行号 列号。
如果没有大写字母,输出 not found。
数据范围
1≤n,m≤10001 \leq n, m \leq 10001≤n,m≤1000,直接遍历矩阵即可,时间复杂度 O(n×m)O(n \times m)O(n×m),空间复杂度 O(1)O(1)O(1)。
代码实现
T5:皓仔的字母占比
思路解析
皓仔想知道:把十进制整数 nnn 转换成 222 到 363636 进制时,哪种进制下表示结果中 字母(A~Z)的占比最大。
进制表示规则
* 数码 0∼90 \sim 90∼9 用字符 '0'~'9' 表示;
* 数码 10∼3510 \sim 3510∼35 用字符 'A'~'Z' 表示(10→A10 \to A10→A,11→B11 \to B11→B,…,35→Z35 \to Z35→Z)。
占比定义
对于一种进制 bbb,设:
* lenlenlen 为 nnn 的 bbb 进制表示的总字符数;
* cntcntcnt 为其中字母(A~Z)的个数。
则字母占比为:
p=cntlenp = \frac{cnt}{len} p=lencnt
我们要找使 ppp 最大的 bbb,如果有多个 bbb 的 ppp 相同,取较小的 bbb。
特殊情况
* 若 n=0n = 0n=0,其表示为 "0",无字母,占比为 000,此时任意进制占比相同,取最小 b=2b = 2b=2。
* 题目保证 n≤1018n \leq 10^{18}n≤1018,进制转换时用 long long 足够。
算法步骤
1. 对每个测试用例,枚举 b=2…36b = 2 \dots 36b=2…36。
2. 将 nnn 转换为 bbb 进制字符串。
3. 统计字符串中字母个数 cntcntcnt,计算占比 ppp。
4. 记录最大占比对应的最小 bbb。
5. 输出结果。
数据范围
1≤t≤1041 \leq t \leq 10^41≤t≤104,0≤n≤10180 \leq n \leq 10^{18}0≤n≤1018。
枚举进制 bbb 最多 353535 种,复杂度 O(35×logn)O(35 \times \log n)O(35×logn),完全可行。
代码实现
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
T6:皓仔的手工课
思路解析
皓仔有 nnn 根绳子,长度分别为 a1,a2,…,ana_1, a_2, \dots, a_na1 ,a2 ,…,an 。
他想把每根绳子剪成长度为 LLL 的小段(整数长度),不足 LLL 的部分丢弃,最终得到至少 kkk 段。
要求 LLL 尽可能大,如果不存在这样的 LLL,输出 000。
关键点
* 对于给定的 LLL,第 iii 根绳子可以剪出 ⌊aiL⌋\lfloor \frac{a_i}{L} \rfloor⌊Lai ⌋ 段。
* 总段数为:
total=∑i=1n⌊aiL⌋\text{total} = \sum_{i=1}^{n} \left\lfloor \frac{a_i}{L} \right\rfloor total=i=1∑n ⌊Lai ⌋
* 需要 total≥k\text{total} \geq ktotal≥k。
* 我们要找最大的 LLL 满足这个条件。
数据范围
n≤100n \leq 100n≤100,ai≤1000a_i \leq 1000ai ≤1000,k≤1000k \leq 1000k≤1000。
LLL 最大不超过 max(ai)\max(a_i)max(ai ),因为当 L>max(ai)L > \max(a_i)L>max(ai ) 时,每根绳子都剪不出完整的一段。
算法思路
由于 LLL 的范围有限(最多 100010001000),可以直接从大到小枚举 LLL:
1. LLL 从 max(ai)\max(a_i)max(ai ) 往下枚举到 111。
2. 对每个 LLL,计算总段数 ∑⌊ai/L⌋\sum \lfloor a_i / L \rfloor∑⌊ai /L⌋。
3. 如果总段数 ≥k\geq k≥k,则当前 LLL 就是答案。
4. 如果枚举完都没有找到,输出 000。
复杂度 O(n×max(ai))≤100×1000=105O(n \times \max(a_i)) \leq 100 \times 1000 = 10^5O(n×max(ai ))≤100×1000=105,完全可行。
代码实现
总结:
我宣布个事哈,我换马蜂了。