搜索的题目

文章目录

代码

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÷ai1=aj÷aj1。设支付硬币数为 X X X,找回硬币数为 Y Y Y,即在 X − Y = x X-Y=x XY=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 naimodx。这样做还是会超时,考虑可以用 map来记忆化, 令 m i , k m_{i,k} mi,k 表示处理到第 i i i 种货币时还要凑 k k k 元的最小硬币数,若此时花费超过了先前记录的花费,就返回。21
生日蛋糕给定蛋糕的体积 ( n ≤ 20000 ) π (n\le 20000)\pi (n20000)π 和蛋糕的层数 m ≤ 15 m\le 15 m15,下层的蛋糕的高度和半径大于上层,问最小的蛋糕表面积(不包括最底层)。强化深搜。首先深搜的顺序从小到大或从大到小。显然从大到小速度更快。其次是最优性剪枝,当前结果 + + + 最底层的表面积如果已经超过原先的最优解,直接 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 n65 根木棍,求把它们拼接成若干根长度相同的长木棍的最短长度。首先最暴力的方法是枚举原木棍的长度,然后对小木棍作全排列,判出正解。接着可以先排序。搜每个原木棍,最后一根木棍不用搜,因为前面都行,剩下来一定可行。如果发现当前原木棍成形,则换新的木棍,并且如果下一根木棍和当前的长度相同,可以直接跳过。最后如果一根小木棍不能放到一个坑位,显然它也不能放到其他坑位(注意,只针对第 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} t500,n1018考虑搜索质因子的个数,按照由小到大的质因数分配,而由于相同的个数,肯定分配给小的质因子更好,所以个数一定是越来越少的。100
集合对于 1 ∼ n 1\sim n 1n 的集合,选择一个子集 A A A,分数初始为· 0 0 0。对于所有 i ∈ A i∈A iA,把 a i a_i ai加入分数。对于所有 i ≥ 2 , j ≥ 2 , i ∈ A , j ∈ A i≥2, j≥2, i∈A, j∈A i2,j2,iA,jA 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
建模离线
剪枝
IDA*
类记忆化搜索
21
23
54
搜索
dfs
24,22,25,100,101
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值