zoukankan      html  css  js  c++  java
  • [BZOJ 3709] Bohater

    Description

    在一款电脑游戏中,你需要打败n只怪物(从1到n编号)。为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点生命值。任何时候你的生命值都不能降到0(或0以下)。请问是否存在一种打怪顺序,使得你可以打完这n只怪物而不死掉

    Input

    第一行两个整数n,z(1<=n,z<=100000),分别表示怪物的数量和你的初始生命值。
    接下来n行,每行两个整数d[i],a[i](0<=d[i],a[i]<=100000)

    Output

    第一行为TAK(是)或NIE(否),表示是否存在这样的顺序。
    如果第一行为TAK,则第二行为空格隔开的1~n的排列,表示合法的顺序。如果答案有很多,你可以输出其中任意一个。

    Sample Input

    3 5
    3 1
    4 8
    8 3

    Sample Output

    TAK
    2 3 1

    Solution:

    不难看出这是一个贪心问题,将打完能整体回血的的怪物和打完整体会掉血的分开。

    1.因为打能回血的怪时无论消耗多少都能恢复,所以应该先打消耗最少的,到后面才有更大的生命值打最大的,打完第一部分时血量到达最大值,所以应该按消耗从小到大排序。

    2.第二部分可以反向思考,将最终状态作为初始状态,那么回血就是掉血,掉血就是回血,因为第二个部分总体掉血,所以反过来总体回血,假设末状态血量为x,那么就让第一个部分结束时尽可能大,反向思考后就成为了第一个部分的问题,按照反向思考后掉血(就是正常情况下的回血)升序排列,反回来就是按照回血降序排列。

    总结:

    贪心算法在贪心策略满足无后效性时才能保证正确性。
    某些贪心的正确性难以严格证明 ,这时可以考虑分部分讨论,逆向思考,枚举多种策略的办法做贪心。

    证明贪心可以举反例、考虑极端情况或者类比论证。

  • 相关阅读:
    小程序mpvue 关闭eslint
    微信开发者工具更新后报错navigationBarBackgroundColor不是hexColor?
    微信小程序图片裁剪插件image-cropper
    A小程序跳转到B小程序,B小程序如何获取参数?
    EditText取消焦点
    RxJava + Retrofit
    TextView显示内容不全
    Android之StrictMode
    CoordinatorLayout实现的效果(标题栏效果)
    Rxbus的使用
  • 原文地址:https://www.cnblogs.com/Liuz8848/p/10332542.html
Copyright © 2011-2022 走看看