Problem 1
Solution
只有同时进来的人才能保证不是同一个人,所以记录人数的最大值和最小值,做差就是要求的答案。
Code
|
|
Problem 2
Solution
- 看上去是一个背包问题,但是由于物体的大小只有1和2,所以可以转换为贪心的方式去做。
- 首先考虑这样一个性质,若要装进物品,则对于相同体积的,一定优先考虑美味度大的,所以对两种物品分别按照美味度降序排序,那么一定是贪心地从大往小装入物品。
- 由于体积的不同,所以单位体积的物品有着不同的美味度,但是受到容量的限制,我们从单位体积这个角度去思考会很难处理诸如:若除以2来计算,那么存在精度问题;若乘2计算,还要考虑是否能放下原本体积为1的物品。
- 故考虑这样一个思路:对容量为的背包,若其中放体积为2的物品,则剩下的部分放体积为1的物品,这样我们就可以枚举在背包中放体积为2的物品的数量,统计最大的答案即可。
- 由于每次选择物品一定是这两个序列的前缀和,所以可以进行前缀和的优化,最终算法复杂度为。
Code by V5ZSQ
|
|
Code by CFhM_R in C++
|
|
Problem 3
Solution
可以看出这是一道01背包的模型题,不同的是本题要求背包用量大于等于时的最小值,故背包 上限应为上限再加一个物品上限(不可能多两个物品构造最优解)。之后从到 2000的dp值取最小即可。
Code by V5ZSQ
|
|
Problem 4
Solution
考虑b数组的下面一些性质:
- b数组的元素代表的是出现的次数,因此这个次数一定不会超过,所以所有超过的对应的一律是0。
- 若,一定有。
- 对于所有不同的,的和
通过上面的性质可以总结出一些剪枝的方法,由此可以暴力枚举dfs b数组的方案,加上上述剪枝,即可通过本题。
Code by V5ZSQ
|
|