V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lirijie1
V2EX  ›  程序员

一个有意思的小问题,不知道有没有人碰到过?

  •  
  •   lirijie1 · 2015-10-03 12:47:34 +08:00 · 4406 次点击
    这是一个创建于 3343 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个英雄打怪,途中有 n 个怪,怪物有两个属性攻击力 a[n]和价格 b[n],英雄初始的攻击力为 0 但是金钱无限,如果英雄的攻击力小于怪物就得以怪物的价格收买作为自己军团的一员,反之则可以直接杀死怪物,收买的怪物战斗力可以叠加,问,通关最少用多少钱?
    16 条回复    2015-10-11 13:40:44 +08:00
    yuchting
        1
    yuchting  
       2015-10-03 15:36:42 +08:00   ❤️ 1
    算法盲人。。。排序 a 、 b 两个表,每次买 a 最高, b 最低的怪,打 b 最高, a 最低的怪,抛砖完毕
    shiznet
        2
    shiznet  
       2015-10-03 18:43:23 +08:00
    怪物出现的顺序是可以自定的么?
    vB4h3r2AS7wOYkY0
        3
    vB4h3r2AS7wOYkY0  
       2015-10-03 19:03:52 +08:00
    是不是我 2 了

    最少用 b[n]
    loudis
        4
    loudis  
       2015-10-03 20:07:36 +08:00
    如果可以随便选怪,找到 a[n]最大值的怪物 i ,然后根据 a[n]/b[n] 性价比排名,再取前几个累加 a 大于 a[i]即可?

    如果打怪顺序开始随机固定,就不好算了。。
    ppdg
        5
    ppdg  
       2015-10-03 20:42:12 +08:00   ❤️ 1
    乍一看貌似是最小费用最大流问题
    glchaos
        6
    glchaos  
       2015-10-03 21:08:14 +08:00
    金钱无限,为什么还要求最少用多少钱?
    songco
        7
    songco  
       2015-10-03 23:16:03 +08:00
    感觉和背包算法思路接近.
    ibeta
        8
    ibeta  
       2015-10-03 23:33:02 +08:00   ❤️ 1
    应该可以利用线性规划求解吧,可惜大学学的都还给老师了。
    写了一个递归版的 demo ,在可杀可不杀时调用递归,计算所有可能的花费,不过太多就栈溢出了╯□╰
    http://jsfiddle.net/ibeta/8dc1o0p1/
    Axurez
        9
    Axurez  
       2015-10-04 00:41:39 +08:00
    途中有 n 个怪,怎么感觉怪的顺序是确定的。。。
    a154312237
        10
    a154312237  
       2015-10-04 00:55:15 +08:00   ❤️ 1
    题目的意思没弄清
    1.怪物顺序已经确定 自己攻击力大于怪物的时候可以选择打死或是收买
    2.攻击力大于怪物的时候必须打死 怪物顺序自己安排
    是哪一个啊
    lzdhlsc
        11
    lzdhlsc  
       2015-10-04 05:45:24 +08:00   ❤️ 1
    钱 d[i]
    战斗力 s[i]
    for i in xrange(n):

    d[i] = min(d[j] if s[j] >= a[i] else d[j] + b[i])
    lzdhlsc
        12
    lzdhlsc  
       2015-10-04 05:46:06 +08:00
    @lzdhlsc 发错了 请无视
    hellov22ex
        13
    hellov22ex  
       2015-10-04 08:31:24 +08:00   ❤️ 1
    b2 ?

    其实我觉得这个和具体钱数有关系

    如果 b1 b2 b3 就是 1 2 3 的话,买了 2 的开始就能吊打了

    但是如果是 1 2 4 的话,还要继续买

    这玩意咋算?楼主有答案了 @我下
    lksltjw
        14
    lksltjw  
       2015-10-04 10:19:51 +08:00 via iPad
    数据规模?
    时间限制?
    空间限制?
    算法题出得这么不专业。。。
    lirijie1
        15
    lirijie1  
    OP
       2015-10-05 11:33:38 +08:00
    @ppdg 我也不晓得,这个是朋友碰到的,他说原题就是这样,没有别的条件了
    linhua
        16
    linhua  
       2015-10-11 13:40:44 +08:00
    @yuchting @lirijie1
    题目是“通关最少用多少钱?”,因此怪物出现顺序是理想的。如果怪物出现顺序确定的话。这题也就没意义了。
    1.买 a 最高, b 最低的怪,这是最理想的情况。
    2.如果 a 最高的怪, b 不是最低。那么通关最少用的钱数是不大于这个 b 的。因为直接买这个怪,肯定能通关。
    因此先按 b 对怪进行排序,从小到大。
    如果” a 最高的怪“位于第 1 或第 2 ,那毫无疑问,通关最少用的钱数就是 b[1],b[2]了。
    若“ a 最高的怪”位于第 3 ,则需对第 1 和第 2 的怪的属性进行相加,比较相加的值和“ a 最高的怪”的属性值,若相加的值 a 较大,且 b 较小,就选相加的那一组合。否则选“ a 最高的怪”。
    若“ a 最高的怪”位于第 4 ,则依次计算 b[1]+b[2],b[1]+b[3],b[2]+b[3],b[1]+b[2]+b[3],直到遇到 a 较“ a 最高的怪”大,且 b 较小为止,这时选对应的组合。或者直到遇到 b 较“ a 最高的怪”大为止,这时选“ a 最高的怪”。遍历完后还没有满足条件的,就选“ a 最高的怪”。
    。。。。。。。。。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1076 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:41 · PVG 06:41 · LAX 14:41 · JFK 17:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.