CodeForces-500C
给n本不同重量的一摞书编号1~n。给定m次操作。操作b代表花费标号为b的书上方其他书的重量总和,将书b位移到这叠书的最上方。问初始书应该如何叠放,才能使m次操作后总花费最小
输入 n本书 m次操作
n个数 书的重量
m个数 操作对象
输出 总花费
题解:我们先考虑每本书读不超过一次。首先就会想到最后哪本书是在最上面是确定的,贪心地考虑最后一步的花费最小,那么这本书应该放在最上方。可上一步的操作已经确定了哪本书目前处于最上方,所以最后这本书最好的情况是处于上方第二本。之后我们将这两本书看成一本,重复上述看待问题的过程,就可以得出书的排放顺序应该与书第一次出现的顺序相同。由于每本书的花费只与它上方的书的重量相关,它下方的书如何摆放不影响结果,所以我们这样对下方的书的排列贪心求解,递归回去,得到的答案一定是正确的。在考虑一本书出现多次是否情况有变。当一本书第二次出现,两次出现之间的书的重量一定对答案有贡献,如果我们改变这本书的初始位置,只会增大对这本书第一次操作的花费,显然只会使答案变大。
总之,我们利用的就是第j次操作时,前面j - 1次操作的书必然在其上方,无论这本书处于哪个位置,前j-1次操作的书的重量都一定对答案有贡献。所以这个贪心没有后效性。记录每本书第一次出现的时间就好了。没有出现的书按任意顺序摆放即可