题目 | 类型 | 难度 |
---|---|---|
Page | 数学 | ★ |
RGB | 数学 | ★★ |
Matrix | 模拟 | ★★★ |
鞍点 | 统计,执行 | ★★ |
Craftman | 二分 | ★★★★ |
Unique Digit Number | 递推,队列 | ★★★★★ |
Page
题意
题目来源于小学3年级奥数题。
一本书从1开始编页码,已知用了n个页码,问书有多少页?
思路
页码位数$i$ | 页范围 | 页码数量$P_i$ |
---|---|---|
1 | 1~9 | $9$ |
2 | 1~99 | $2\times90+9$ |
3 | 1~999 | $3\times900+2\times90+9$ |
所以可以递推出页码位数下最多的页码数量,然后根据$n$的值,找出页码数量比n大的最小页码位数i。
所以结果就是$\underbrace{99\cdots9}_{i-1} + (n - P_{i-1}) / i$
标程
1 |
|
RGB
题意
红绿蓝三色球排成一行,一次可以任意调换两个球的位置,求把所有球排列成红绿蓝三种单色区间需要交换的最少次数。
思路
与颜色区间不同颜色的球才需要调换。
如果相对颜色区间存在相对颜色的球,那就先对换。
最后剩下的肯定是 红区绿球,绿区蓝球,蓝区红球 或者 红区蓝球,绿区红球,蓝区绿球 这两种。这是一个轮换,两次交换就可以完成。
假设红区绿球,蓝球分别为rg,rb;绿区红球,蓝球分别为gr,gb; 蓝区红球,绿球分别为br,bg;
那么
标程
1 |
|
Matrix
题意
一个指令序列,包括矩阵初始化,矩阵交换行、列,矩阵按行、列镜像翻转,矩阵转置和输出矩阵的操作,模拟指令序列。
思路
很直白的模拟题,直接做就可以,代码量稍大。镜像翻转可以用行列交换来实现,矩阵转置注意矩阵的维度也要交换。
指令的前两个字符相加值是唯一的,可以用来作指令字符串的hash,快速判断是哪个指令,不过这个并不影响题目本身
标程
1 |
|
鞍点
题意
题目来源于矩阵中一个常见的问题(当年还是我读书的时候,数据结构老师问的),不过我把定义稍微改了一点,增加了所在列最大,行最小。
求矩阵中所在行最大,所在列最小或者所在行最小,所在列最大的元素。
思路
明显的统计题,直接遍历矩阵,统计每行每列的最大、最小值。再遍历矩阵,判断元素是否满足条件。
标程
1 |
|
Craftman
题意
题目来源CF原题(题号也不记得了),我修改了一下题面描述。
做一件“恶魔手套”需要$n$种原材料,分别需要$a_i,i=1,2,\ldots,n$份,你有$b_i,i=1,2,\ldots,n$份材料。
你还有$k$张材料兑换券,一张券可以兑换任意一份材料,问你最多能做几件“恶魔手套”?
思路
$f(x)$表示制作$x$件恶魔手套需要的兑换券的数量。
问题转换成求满足$f(x) \le k$情况下,最大的$x$。
显然,$f(x)$是单调递增的,所以很容易想到使用二分求上限即可。
标程
1 |
|
Unique Digit Number
题意
求第$n$个数码不相同的数。
思路
明显$0-9$是数码不相同的数。如果$p(p>0)$是数码不相同的数,$j$是p没有使用过的数码,那么$10p+j$也是数码不相同的数。
所以我们可以用一个队列来生成和存放所有的不同数码的数,由于生成是有序的,所以队列里也是有序的。
题目有提示,这样的数最多有8877691个。
标程
1 |
|