飞翔的飞翔的飞翔 level
获赞
72
粉丝
1
关注
5
看过 TA
1
中国科学技术大学
2019
C++
IP属地:未知
暂未填写个人简介
私信
关注
2018-04-11 18:23
已编辑
中国科学技术大学 C++
想来也被这道题困扰了十多天了。:< 这是我当时的代码,用了BFS的思路(贼傻瓜),只通过了20%的测试用例,时间复杂度太高了。现在也没想出比较好的方法,求一个茅塞顿开啊! #include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <string> #include <queue> using namespace std; /* Approach: BFS */ struct Node { ...
Leoric:作者:Leoric 链接:https://www.nowcoder.com/discuss/73357 来源:牛客网       首先计算出假设你是无敌状态(不会死亡)至少需要多少步打死怪兽,先进行a次加攻击操作,再进行b次攻击操作,且a+b最小。这个结果可遍历得到(可能列式直接计算也行)。这样,就把加攻击和攻击两种操作合并了,称为杀怪操作,并设这个操作最小次数为c。复杂度O(100*100)。       接着考虑生存方面,同样,把回血和减攻合并为防御操作。显然,我们需要先进行防御操作,使怪兽的攻击和自身的生命值足以让我们进行c次攻击操作。在防御操作中,我们应该尽可能地把减攻操作给安排在前面,即如果整个战略中还需要进行减攻操作且自身当前的生命值大于怪兽攻击力,则必然进行减攻操作。另外,假设我们完成了减攻操作,则进行d次回复,使得能够进行c次攻击且自身不会死亡。因此,可以从初始状态出发,令step=0。然后循环使step++,并且如果怪兽攻击力大于生命值,则回复生命值,否则减少怪兽攻击力,对于每个step,可以用O(1)的复杂度直接计算出回复次数d,则总步数为step+d+c。这样计算得到多个总步数,取最小值就得到最终结果。复杂度O(100)。         
投递网易雷火等公司10个岗位 >
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务