test0709 搜索专题

test 0709

T1 开关灯

得分情况

期望:60

实际:60

改后:100

题意

节日宴会上,我们有 \(N (10 \le N \le 36)\) 盏彩色灯,他们分别从 \(1\)\(N\) 被标上号码。

\(M\) 条边连接着这些灯,当按下某一盏灯的开关的时候,这盏灯本身以及所有和这盏灯有边相连的灯的开关状态都会发生改变。

最开始所有灯都是被关着的,问需要至少按下多少开关,才可以把所有灯打开。

犯傻原因

可能的确没想到可以折半搜索吧……

正解

折半搜索,先处理前半部分可以达到的情况以及达到此情况需要的代价,可以用 std:map 维护……

然后搜索另外一半,直接上就可以了……

T2 翻煎饼

得分情况

期望:70

实际:80

改后:100

题意

有一列 \(N\) 个半径两两不同的煎饼摞在一起,为了简化问题,我们假设这 \(N\) 个煎饼的半径依次为 \(1\)\(N\),定义翻转操作:选取一个 \(1\)\(N\) 之间的正整数 \(i\) ,将从顶向下的前 \(i\) 个煎饼顺序翻转过来,例如:

假设有七个煎饼,从顶向下的半径依次为为

4 3 2 1 5 6 7

对前三个煎饼进行翻转:

2 3 4 1 5 6 7

给出摞在一起的 \(N\) 个煎饼从顶向下的半径,问若想要将煎饼排成 最顶端的煎饼最小,最底端的煎饼最大,从顶向下每个煎饼的半径都小于它下面的煎饼 的状态,最少需要多少次操作?

犯傻原因

因为不保证自己减枝的正确性,把估价的范围扩大了……然后就T了

正解

迭代加深搜索,同时 \(A\) 剪枝。

易知,如果两个相邻的数相差大于 \(1\) ,那么期间必有一次交换,才能保证可以到达相应位置,那么估价函数就为相邻两个数差距大于 \(1\) 的个数,然后就可以过了……

T3 智破连环阵

得分情况

期望实际:0

改后:100

题意

洛谷题库

犯傻原因

压根没动……

正解

我们先求出数组 \(f_{i,j}\) ,表示第 \(i\) 个炸弹,从第 \(j\) 个武器开始起作用,可以消灭到第几个武器。这个数组很好求,即 \(f_{i,j} = \max(j,f_{i,j+1})\) \(i\)可以打到 \(j\)

之后考虑计算估价函数,设其为 \(g\)。假设现在消灭了前 \(j-1\) 个武器,考虑从现在开始消灭完所有武器要用多少个炸弹,显然就是 \(\min_{i=1}^n{ g_{f_{i,j}+1}}+1\)

然后再去跑搜索。在搜索的时候,需要记录两个状态:消灭了多少个武器,用了多少个炸弹。

每次往下搜的时候,枚举这一次消灭到了第多少个武器,这样就可以知道哪些炸弹是合法的。

但是这样还不行,因为可能这些炸弹在前面用过,所以需要跑一个二分图匹配,以保证每个炸弹只会用一次。事实上这样就足已通过本题。

考试总结

这次考试还是有许多可以提高的地方,比如时间把握问题导致T3没有动手,T1也只写了个暴力,T2没能想清楚剪枝情况白白丢失 \(20pts\)

以后考试的时候还是要多想,多思考可行的方案,把握好时间暴力要打出来……

posted @ 2020-07-10 18:53  ztz_cpp  阅读(196)  评论(0编辑  收藏  举报