/ Vijos / 讨论 / 月赛 /

[b]Vijos10月份月赛简要题解[/b]

数据统计:

  略。

巧克力:

  简单的贪心。由于对于两条横线(或竖线),显然应当先切值大的会更优。对于一条横线和一条竖线,不妨设切横线的价值为x,设切竖线的价值为y,此时横线已切了A次,竖线已切了B次。若有x>y,则必有x*B+y*(A+1)1即可判断它在删除1号果罐之后是否还可以组成。而对于2号糖果罐的结果,我们可以令它成为编号最小的,方法就是将1号果罐的编号改成n+1。……

  具体地,首先我们将n个糖果罐复制一段,变为2*n个。设f[i][j]表示前i个糖果罐,组成和为j的糖果 方案中最小果罐编号 最大是多少。

  方程很容易推出:(使用负无穷表示不存在方案)

  ① j=a[i] :f[i][j] = i;

  ② j!=a[i] :f[i][j] = max(f[j],f[j-a[i]])。

  求出f[n]之后,对于f[n][i]>1的i,表示i在删除1号之后仍然存在;求出f[n+1]之后,对于f[n+1][i]>2的i,表示i在删除2号之后仍然存在,……即可求得第一问结果,复杂度为O(n^2*a)。

  

  经过前面的分析,我们知道了删除一个之后如果有X种数量,调整之后将会有2*X种数量,第二问则是要使得调整后该糖果罐中数量尽可能少,而仍然存在2*X种不同数量的糖果。

  假设我们当前求出了第一问,并得知了删除该糖果罐后可以组成的不同糖果数集合{d}。若调整后该糖果罐的数量为p,那么对于集合任意元素di,调整后di+p一定也会在新的糖果数集合内。而为了使数量能够翻倍,di+p一定不能与之前的某个dj重合。也就是说p不能是任意di和dj的差值。如果我们能够求出任意di和dj差值构成的集合,取集合中没有出现过的最小正整数即是答案。

  这是一个经典的背包问题(天平背包),用g[i][j]表示前i个糖果罐,差值为j是否有可能。g[i][j] = g[j] or g[j-a[i]] or g[j+a[i]]。

  问题解决,复杂度O(n^2*a)。

  PS:第一问还有其他比较优秀的算法(例如分治,或者将0\1背包的bool转成方案数int,以便用于倒退),有兴趣的同学可以尝试去探究或者与我讨论。:D

11 条评论

  • @ 2012-10-29 22:34:48

    第一题众数怎么求

    真心不会。。

  • @ 2012-10-29 15:13:27

    第一题30分我做错了什么

  • @ 2012-10-29 08:33:43

    RE:hsez_ljc

    RE:hsez_ljc

    需要取模,为了保证正确性,可以多取几个模数。

  • @ 2012-10-28 22:37:45

    请问一下第四题

    第四题的第一问,如果转化成求方案数,方案数不会爆掉吗?

    如果取模,该如何判断..

  • @ 2012-10-28 17:41:04

    RE:zyx980506

    RE:zyx980506

    数据应该没有问题,赛题已经添加至题库,可以再进行尝试。

  • @ 2012-10-28 15:29:30

    贪心

    贪心问题的证明一般基于调整的思想,

    在第二题的任意一种方案中,如果一个小权的在大权前面,那么把两个交换一定不会变差,所以最优方案是从大到小排序。

  • @ 2012-10-28 15:22:18

    貌似理解了。。

    RT。。

  • @ 2012-10-28 14:43:42

    第二题

    "故对整体而言,按照从大到小的顺序切也会最优" 前面只论证了一条横线和一条竖线的情况,如何推出 多条竖线和多条横线的情况?切一次横线不是所有竖线都多一次吗?这里一直想不通,求教

  • @ 2012-10-28 11:29:15

    我郁闷了

    第一题n的数据范围少看了一个0。。。。。。

  • @ 2012-10-28 08:55:07

    有测试数据吗

    最后一题怎么我只有30分,可不可以提供一下测试数据?谢谢

  • @ 2012-10-27 23:56:18

    最后一题沙茶做法

    第一问见lqp集训队作业POJ challenge题解中的A题,第二问FFT。

  • 1