zoukankan      html  css  js  c++  java
  • CodeForces-500C

    传送门

    给n本不同重量的一摞书编号1~n。给定m次操作。操作b代表花费标号为b的书上方其他书的重量总和,将书b位移到这叠书的最上方。问初始书应该如何叠放,才能使m次操作后总花费最小

    输入 n本书 m次操作

           n个数 书的重量

    m个数 操作对象

    输出 总花费

    题解:我们先考虑每本书读不超过一次。首先就会想到最后哪本书是在最上面是确定的,贪心地考虑最后一步的花费最小,那么这本书应该放在最上方。可上一步的操作已经确定了哪本书目前处于最上方,所以最后这本书最好的情况是处于上方第二本。之后我们将这两本书看成一本,重复上述看待问题的过程,就可以得出书的排放顺序应该与书第一次出现的顺序相同。由于每本书的花费只与它上方的书的重量相关,它下方的书如何摆放不影响结果,所以我们这样对下方的书的排列贪心求解,递归回去,得到的答案一定是正确的。在考虑一本书出现多次是否情况有变。当一本书第二次出现,两次出现之间的书的重量一定对答案有贡献,如果我们改变这本书的初始位置,只会增大对这本书第一次操作的花费,显然只会使答案变大。

    总之,我们利用的就是第j次操作时,前面j - 1次操作的书必然在其上方,无论这本书处于哪个位置,前j-1次操作的书的重量都一定对答案有贡献。所以这个贪心没有后效性。记录每本书第一次出现的时间就好了。没有出现的书按任意顺序摆放即可

  • 相关阅读:
    less 28-31
    less27 27a
    sqli 26 26a
    sqli lab 25 25a
    kail 更新源
    sqli lab 23 、24
    less 20 21 22
    less18 19
    less 17
    数字类型,字符串类型,列表类型
  • 原文地址:https://www.cnblogs.com/xFANx/p/7403316.html
Copyright © 2011-2022 走看看