【题解】FZOJ 4901 大象

题面

你有\(n\)只大象,第\(i\)只大象的体积是\(S_i\),神仙程度为\(V_i\)

另外有\(m\)个冰箱,第\(i\)个冰箱的容积是\(C_i\)

只有大小不超过\(C_i\)的大象才能放入第\(i\)个冰箱中,每个冰箱最多只能放一只大象。

你需要将这些放了大象的冰箱排成一排,使得

  • 对于任意两个相邻的冰箱,右边的冰箱容积不小于左边的冰箱
  • 对于任意两只相邻的大象,右边的大象的神仙程度不小于左边的大象的神仙程度

求最多能将多少只大象放入冰箱。

对于 50% 的数据,\(n,m\le 10^3\)
对于 100% 的数据,\(n,m\le 10^5,S_i,v_i,C_i\le10^9\)


题解

50pts

将大象按照\(v\)从小到大排序,冰箱按容积从小到大排序。那么我们顺序选择大象和冰箱,就可以去掉那两个限制条件。

考虑dp,设\(f[i,j]\)表示 使用前\(i\)只大象 和 前\(j\)个冰箱,最多能放入的大象数量。

接下来分情况讨论,若要将第\(i\)只大象放入第\(j\)个冰箱,则\(f[i,j]=f[i-1,j-1]+1\)

若第\(i\)只大象不放入第\(j\)个冰箱,则\(f[i,j]=max\{f[i-1,j],f[i,j-1]\}\)

解释一下第二种情况,可能是第\(i\)只大象已经放入了前\(j-1\)个冰箱,也可以由前\(i-1\)只大象已经放入了前\(j\)个冰箱转移来。(当时就是只写了\(f[i-1,j]\),悲桑.jpg)

时间复杂度\(O(n^2)\),可以拿到50pts。(也有可能是我不会优化)


100pts

还是按照之前的方法排序。

若能将当前最神的大象放入容积最大的冰箱,就放,这样是最优的。

因为如果不放这头大象,放了另外一只,由于神仙程度单调递减的条件,会妨碍后面的大象进冰箱,所以不优。

而将最神的大象放入容积小一点的冰箱,显然也是不优的。

直接模拟即可,复杂度\(O(nlogn)\)

posted @ 2021-09-20 16:25  hzy1  阅读(49)  评论(0编辑  收藏  举报