一道背包神题-Petrozavodsk Winter-2018. Carnegie Mellon U Contest Problem I
2021-07-12 15:06
标签:cstring 神题 else clu using 意义 大于 bsp 有一个 有\(n\)个物品,每个物品有一个体积\(v_i\),背包容量\(s\)。要求选一些物品恰好装满背包且物品个数最少,并在这样的方案中: (1)求出中位数最小的方案的中位数(\(k\)个元素的中位数是从小到大第\(⌊k/2⌋\)个数); (2)求出众数最小的方案的众数; (3)求出极差最小的方案的极差。 令每个物品价值为1,求装满时的最小价值,这只需01背包即可,答案即为最小个数\(m\)。 对于众数,二分答案并删去多余物品即可。 对于中位数,二分答案,令每个物品价值为\(inf+t\),其中体积大于二分的答案时\(t\)为1,否则为-1。同样求出装满时最小价值,若超过\(m\times inf\)则真正答案更大,否则更小。正确性是因为任意时刻,\(dp_i\)保存的值若要求最优,首先要保证取的个数是最少的(否则没有意义),在此条件下尽可能少取体积大的物品。而全局最优答案必然由局部最优答案转移(可反证)。 对于极差,考虑从小到大加入物品,每个物品价值\(inf\),但是若该物品第一次加入背包则价值\(inf-v_i\)。每加完一个物品\(i\)更新完\(dp\)后,求\(dp_s+v_i\)。所有值取最小即可。 时间复杂度\(O(ns \log n)\) 根据以上思路,除了极差部分可全部转化为普通01背包,大大减小了代码量(仅60行)。极差部分也非常好写,详见代码。 可惜比赛时没想出来!赛后过了若干天补题时想了一会就出来了(生气~)。最后,这道题质量真是太高啦!“题出的好!难度适中,覆盖知识点广,题目又着切合实际的背景,解法比较自然。给出题人点赞!” 一道背包神题-Petrozavodsk Winter-2018. Carnegie Mellon U Contest Problem I 标签:cstring 神题 else clu using 意义 大于 bsp 有一个 原文地址:https://www.cnblogs.com/zbh2047/p/9597643.html题目描述
解题思路
一些感受
AC代码
1 #include
文章标题:一道背包神题-Petrozavodsk Winter-2018. Carnegie Mellon U Contest Problem I
文章链接:http://soscw.com/essay/104211.html