【题解】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)\)