- 月赛
- 2012-10-29 22:34:48 @
数据统计:
略。
巧克力:
简单的贪心。由于对于两条横线(或竖线),显然应当先切值大的会更优。对于一条横线和一条竖线,不妨设切横线的价值为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 条评论
-
111qqz LV 7 @ 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