代码
dfs
题目 | 题意 | 思路 | 代码 |
---|---|---|---|
AT231E | 有 n n n 种面值的硬币,第 i i i 种硬币的面值是 a i a_i ai,且满足 a 1 = 1 , a i ÷ a i − 1 = a j ÷ a j − 1 a_1=1,a_i\div a_{i-1}=a_j \div a_{j-1} a1=1,ai÷ai−1=aj÷aj−1。设支付硬币数为 X X X,找回硬币数为 Y Y Y,即在 X − Y = x X-Y=x X−Y=x 时求 min ( X + Y ) \min(X+Y) min(X+Y)。 | 设当前处理到的货币面值是
a
i
a_i
ai,剩余
x
x
x 元未凑,按货币面值从大到小搜索,因为是等比数列,可以直接贪心,尽量付钱使剩余的钱最小(即剩余
a
i
m
o
d
x
a_i\mod x
aimodx)或多用
1
1
1 枚硬币,凑找回的钱
n
−
a
i
m
o
d
x
n-a_i\mod x
n−aimodx。这样做还是会超时,考虑可以用 map 来记忆化, 令
m
i
,
k
m_{i,k}
mi,k 表示处理到第
i
i
i 种货币时还要凑
k
k
k 元的最小硬币数,若此时花费超过了先前记录的花费,就返回。 | 21 |
生日蛋糕 | 给定蛋糕的体积 ( n ≤ 20000 ) π (n\le 20000)\pi (n≤20000)π 和蛋糕的层数 m ≤ 15 m\le 15 m≤15,下层的蛋糕的高度和半径大于上层,问最小的蛋糕表面积(不包括最底层)。 | 强化深搜。首先深搜的顺序从小到大或从大到小。显然从大到小速度更快。其次是最优性剪枝,当前结果
+
+
+ 最底层的表面积如果已经超过原先的最优解,直接 return 。第二层剪枝,因为
n
n
n 必须满足可以造当前蛋糕,所以可以把下面的判断写到上面去(显然,剪枝力度非常小)。接下来是一个强度非常大的剪枝。
2
×
n
÷
(
R
[
x
+
1
]
)
2\times n \div (R[x + 1])
2×n÷(R[x+1]) 是必须保留的,要为上面剩下的蛋糕做空间(每层蛋糕最少需要的宽度和高度)。最后,搜索是先尝试大的。 | 22 |
埃及分数 | 给定 a , b ( 1 < a , b < 1000 ) a,b(1<a,b<1000) a,b(1<a,b<1000),使用分子为 1 1 1 的若干个分数相加得到 a b \frac{a}{b} ba,首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越好,求具体方案。 | 迭代加深搜索。首先先枚举由多少个数构成。然后把当前剩下的分子和分母等传进去。 | 23 |
靶形数独 | 给一个待填的数独,填充完整,求所有填法中的每个格子的得分之和的最大值,每个格子的得分是这个格子的数 × \times × 这个格子的分值,最外面一圈是 6 6 6 分,往内一圈是 7 7 7 分, ⋯ \cdots ⋯,最中间一格是 10 10 10 分。 | 把空格先筛选出来,把有数的格子的同行列九宫的数打好标记,然后搜索,判同行列九宫是否有重复,然后搜出最优解。 | 24 |
小木棍 | 有 n ≤ 65 n\le65 n≤65 根木棍,求把它们拼接成若干根长度相同的长木棍的最短长度。 | 首先最暴力的方法是枚举原木棍的长度,然后对小木棍作全排列,判出正解。接着可以先排序。搜每个原木棍,最后一根木棍不用搜,因为前面都行,剩下来一定可行。如果发现当前原木棍成形,则换新的木棍,并且如果下一根木棍和当前的长度相同,可以直接跳过。最后如果一根小木棍不能放到一个坑位,显然它也不能放到其他坑位(注意,只针对第
1
1
1 个放入的或最后
1
1
1 个),则可以 return ,还有搜索小木棍按照长度从长到短排序。 | 25 |
高级打字机 | 现有一款文本输入器,可以进行以下 3 3 3 种操作:1.T x:在末尾添加一个小写字母 x x x。2.U x:撤销最后的 x x x 次修改操作(操作1、2是修改操作,操作3不作为修改操作)。3.Q x:询问当前字符串的第 x x x 个字母并输出。 | 对于没有撤销的数据,可以直接用栈模拟。否则,把撤销多次的字符串找到以前的串,然后构建树。对于有访问的节点,可以标记一下,然后遍历时求出来。因为要保证询问是的顺序,所以要把答案标号,存下来统一输出即可。 | 54 |
约数个数 | 有 t t t 次询问,每次给你一个数 n n n,求在 [ 1 , n ] [1,n] [1,n] 内约数个数最多的数的约数个数。 t ≤ 500 , n ≤ 1 0 18 t\le 500,n\le 10^{18} t≤500,n≤1018 | 考虑搜索质因子的个数,按照由小到大的质因数分配,而由于相同的个数,肯定分配给小的质因子更好,所以个数一定是越来越少的。 | 100 |
集合 | 对于 1 ∼ n 1\sim n 1∼n 的集合,选择一个子集 A A A,分数初始为· 0 0 0。对于所有 i ∈ A i∈A i∈A,把 a i a_i ai加入分数。对于所有 i ≥ 2 , j ≥ 2 , i ∈ A , j ∈ A i≥2, j≥2, i∈A, j∈A i≥2,j≥2,i∈A,j∈A 的 i , j i,j i,j,如果存在整数 k > 1 k>1 k>1 满足 i k = j i^k=j ik=j,从分数里减去 b j b_j bj。请求出分数最高的子集A的分数是多少。 | 乍一看搜索超时,实际上就是搜索。对于每个数都分组,如果它之前不归属任意一组,则新开一组,把它的若干次幂加入组内,否则不另外分组。对于每组进行爆搜,时间复杂度可保证 | 101 |