获赞
55
粉丝
10
关注
6
看过 TA
14
上海交通大学
2021
C++
IP属地:未知
暂未填写个人简介
私信
关注
2020-04-08 17:38
已编辑
字节跳动_DATA_推荐算法工程师
第一题AC了,要注意结果要和木头人数量m取min if __name__ == "__main__": T = int(input()) ret = [] def woodman(n, m, a, b): if n < a: return 0 if n == a: return b if (n - a) * b // a + b > m: return m else: return (n - a) * b // a + b for count in range(T): tmp = list(map(int, input()....
haozheyan97:第一题分两种情况。 首先如果 b > m需要调整到b = m. 1. n < b. 显然答案为0. 2. n >= b. 显然我们总伤害数为n * b. 理论上最大能够打min(m, n * b // a)个木头人。 下面证明确实可以做的到打那么多个。 假设我们理论最大值为k个, 每个为a血, 则我们可以把它排成一个k * a的矩阵,每个元素都为1. 现在我们每一次可以划去不同行中的至多b个1. 那么显然我们可以按照每一列从左往右划去1. 因此一定最终能划完。 而每一行剩余的1的数量代表木头人的血量, 当这个矩阵内所有的1都被划去的时候,就意味着我们可以做到打掉k个木头人。 第二题dp。 设f(i, j)为从[i, j]开始走能得到的最大和值,则可以得出以下转移方程。 f(i, j) = A[i][j] + max{f(i ± k, j ± k) | A[i ± k][j ± k] > A[i][j]} 然后记忆化搜索就可以过了。
投递阿里巴巴等公司10个岗位 >
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务