\(\text{I}\). P2949 [USACO09OPEN] Work Scheduling G
按截止时间依次考虑每一个工作。若能继续完成,就完成当前的工作;否则若目前已完成工作中价值最小的劣于当前工作,就将那一工作替换为当前工作。
至于维护价值最小的,可以将已完成工作丢进一个小根堆,即可维护最小值。
\(\text{II}\). P4053 [JSOI2007] 建筑抢修
类似上一道题,我们每次替换的一定是性价比最低的。
而在此题中,完成时间越长性价比越低。所以也用堆维护即可。
\(\text{III}\). CF865D Buy Low Sell High
若简单的思考,我们会卖出会选择之前价格最小的一天买入。但这样不一定最优,所以考虑改变贪心策略。
定义 \(a\) 为全局最优解中买入那天的价格,\(b\) 为全局最优解中卖出那天的价格,\(c\) 为其中任意一天的价格。那么有
所以我们可以先按上述策略贪心。每次买卖是都将卖出的价格再次放入堆中,若以后将其取出,贡献意味着换一天卖出股票。
所以我们可以凭此消去中间项。
\(\text{IV}\). [CQOI2012] 组装
先考虑已确定每种零件的生产车间的情况。
记组装车间为 \(x\),第 \(i\) 种零件选择的车间为 \(p_i\),那么有
因为 \(n>0\),开口向上,所以当 \(x=\frac{\sum_{i=1}^np_i}{n}\) 时取到最小。
现在只需求出一个最优的 \(p\)。
先令 \(p\) 为所有零件最小的车间,考虑逐步更换数组 \(p\)。定义 \((i,a,b)(a<b)\) 表示将 \(p_i\) 从 \(a\) 改为 \(b\),通过邻项交换法来决定更换顺序。
假设先执行 \((i,a,b)\) 后执行 \((j,a^\prime,b^\prime)\) 没有取到最优解,说明:
-
因为 \(a\) 在最优解中二 \(b\) 不在,说明最优的 \(x<\frac{a+b}2\)。否则保持 \(x\) 不变,将 \(a\) 换成 \(b\) 会使答案更小。
-
同理,得到最优的 \(x>\frac{a^\prime,b^\prime}2\)。
综上,有 \(a+b>a^\prime+b^\prime\)。所以只要按 \(a+b\) 从小到大执行上述更换,就不会出现上述情况。
初步考虑认为这样的 \((i,a,b)\) 对可能有 \(n^2\) 种。但实际上对于同一个 \(a\),只有最小的 \(b\) 才会参与更换,所以只有 \(n\) 对。
具体来讲,只需要对同一个零件相邻的生产车间对考虑即可。
时间复杂度 \(O(n\log n)\)。瓶颈在排序。
\(\text{V}\). [AGC022D] Shopping
妙妙贪心题。
由于摆渡车往返一次花费 \(2L\) 的时间,所以答案一定是 \(2L\) 的倍数。最后再乘上 \(2L\) 即可。
对于一个 \(t_i\),若其 \(>2L\),那么一定会多等一次往返,所以可以先令 \(ans\) 加上 \(\lfloor\frac{t_i}{2L}\rfloor\),并令 \(t_i\) 模上 \(2L\)。
先考虑证明答案上界为 \(2L(n+1)\):
考虑按编号逐个经过被一个商场,最后再走一次到达点 \(0\)。一共是 \(n+1\) 次往返。
考虑记 \(l_i=[2x_i\ge t_i],r_i=[2(L-x_i)\ge t_i]\)。说人话就是是否能在 \(0\) 处往返时顺路算上和是否能在 \(L\) 处往返时顺路算上。
若存在 \(i,j\) 满足 \(x_i<x_j\land l_i=l_j=r_i=r_j=1\),说明可以用一次往返同时满足 \(i,j\) 两点,所以答案可以减 \(1\).
再考虑 \((l_i,r_i)=(0,1),(1,0)\) 的情况。根据定义可以得出 \((l_i,r_i)=(0,1)\) 的点满足 \(x_i\le\frac{L}{2}\),\((l_i,r_i)=(1,0)\) 的点满足 \(x_i>\frac{L}{2}\)。所以这两类点之间不可能相互匹配。
于是只有 \((1,1),(0,1)\) 和 \((1,0),(1,1)\) 之间的匹配,直接模拟即可。
最后再考虑 \((1,1)\) 内部的匹配。
若存在 \(t_i=0\) 的点,直接令 \(ans--\) 并舍去。
若 \(r_n=1\),说明最后一个回到点 \(0\) 的往返可以顺路带上 \(n\),直接令 \(ans--\)。否则就不可能被匹配,直接删掉。