[NOI 2012] 三重镇 题解
[NOI 2012] 三重镇 题解
由三个人共同完成,@liuyuzhuo,@HBWH_zzz,@Into_qwq。
用来手玩的代码,输入每个测试点对应的 .in 文件即可食用,操作格式与题目中相同,并增添了 REJECT 操作(撤销上次放置操作,注意无法撤销星星和炸弹)。
测试点 1:
3 3
0 0
.1.
.11
...
30
首先初始局面有三个
然后采取策略:尽量让相同的数相邻,且大的放边角。
建筑序列很小,大概手玩一下就可以了。
注意这个点合满才能拿到
测试点 2:
1 3
40 60
...
80
只有一排三个点,说明显然只有一种升级建筑的途径,需要巧妙地利用星星和炸弹。
其实可以直接 dp,记录状态:当前操作到序列的第几个,还有多少个星星,多少个炸弹,当前局面为啥的最大得分。
状态数:
这里写了个记忆化搜索。
code
测试点 3:
1 3
100 300
...
400
和测试点
采用手动 wqs 二分的方法,不记星星这维(因为程序很能把握住炸弹的使用),然后再看这个最优解用的星星数,通过星星数二分给星星附的权值。
code
但是这样要么多
但是我们还有第二个点的记忆化搜索!
让 wqs 跑出多
最终把两个答案拼起来,得到了结果。
测试点 4:
1 100
0 0
....................................................................................................
360
观察可知:序列全是
可以发现,三个
111
111
111
容易发现,这样会花费横向
最后就是这样的形式:
113113...1131122
code
测试点 5:
20 20
0 0
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
11000
这是对测试点
我们定义生成一个数字消耗的格子为合成它所放过的格子,一个数字如果最后合成在所有消耗的格子中角落里的格子则我们称它能在角上合成,如果最后合成在所有消耗的格子中边上的格子则我们称它能在边上合成。
比如
容易发现,
如:
111
...
...
2..
111
...
2..
2..
111
...
...
3..
这样合成一个
由于二维相对一维可能性太多,因此需要写一个程序来合成
code
测试点 6:
1 20
2383 0
....................
0
该测试点一维,且只有星星。
由于只用考虑一维,我们设
递归即可。
code
测试点 7:
6 6
0 0
......
......
......
......
......
......
1231
经过计算发现第
由于出题人十分善良,所有的拆分都是连续的(即对于每个数都存在一种拆分方案对应了原序列的
code
测试点 8:
8 8
0 0
........
........
........
........
........
........
........
........
7948
该测试点从测试点
测试点 9:
6 6
0 0
112..1
....12
.21...
2....1
1....1
......
3000
这个点没有星星和炸弹,但是序列没有什么特殊性质。
对于测试点
code
测试点 10:
6 6
200 200
......
1....1
.11222
11.122
22.2..
.2....
30000
该测试点没有任何特殊性质。
该测试点只需要在测试点
code
用时接近一个月,终于拿下了这道题。
可喜可贺。