4.8阿里笔试讨论

第一题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().split(' ')))
        ret.append(woodman(tmp[0], tmp[1], tmp[2], tmp[3])) for qq in range(len(ret)): print(ret[qq])
第二题用回溯会超时,只过了30%,不知道有没有ac了的大佬指点一下怎么优化

if __name__=="__main__":
    T=int(input())
    ret=[]
    n=0  k=0  result=[] def trackback(axis, plus):
        i, j = axis
        current = array[i][j]
        flag = 0  for m in range(1,k+1): if  i + m < n: if array[i + m][j] > current:
                    flag = 1  trackback((i + m, j), plus + array[i + m][j]) if i - m >= 0: if array[i - m][j] > current:
                    flag = 1  trackback((i - m, j), plus + array[i - m][j]) if j + m < n: if array[i][j + m] > current:
                    flag = 1  trackback((i, j+m), plus + array[i][j + m]) if j - m >= 0: if array[i][j - m] > current:
                    flag = 1  trackback((i , j-m), plus + array[i][j - m]) if flag == 0:
            result.append(plus) for count in range(T):
        tmp=input().split(' ')
        n=int(tmp[0])
        k = int(tmp[1])
        array=[] for i in range(n):
            array.append(list(map(int,input().split(' ')))) if k==0 or n==1:
            ret.append(array[0][0]) continue  result=[]
        trackback((0,0),array[0][0])
        ret.append(max(result)) for qq in range(len(ret)): print(ret[qq])

#阿里笔试##阿里巴巴##笔试题目#
全部评论
第一题分两种情况。 首先如果 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]} 然后记忆化搜索就可以过了。
4 回复 分享
发布于 2020-04-08 17:23
我发现就我是个小**
1 回复 分享
发布于 2020-04-08 17:14
&我用的dp+bfs 25%🤣
1 回复 分享
发布于 2020-04-08 17:09
有没有题目和示例的完整描述,想看一下。谢谢!
点赞 回复 分享
发布于 2020-04-09 16:19
因为木头人的血量都相同,所以我们只需要按轮次对木头人进行削血,就可以保证始终是最大攻击范围。当然只是我的一个推断,不知道是否成立。求大佬赐教。
点赞 回复 分享
发布于 2020-04-09 14:29
已拿到offer,笔试只是个参考,做不做都无所谓
点赞 回复 分享
发布于 2020-04-09 11:51
第二题他标程必定挂了。考虑这样一个问题,假设存在2个以上0,最左边的0可以通过左边第二个0左移至最左边0的右边一位,凑成00然后改为10,此时数必然变大,因为最高位的0变为了1,所以如果存在0最终必然是只剩一个0且记第一个0位置为fi,0个数为num,则最终剩下的0位置在fi+num-1
点赞 回复 分享
发布于 2020-04-08 21:38
同样,第一道AC,第二道DFS30%
点赞 回复 分享
发布于 2020-04-08 19:46
😫没想到第一题这么简单!!我还在那证明了好久,发现证不出来就没再看了,早知道先写一个试试看的...太可惜了!早知道不管三七二十一写上去再说。这么简单的题我0了....哭死 第二题同回溯TLE 35分。比LZ多五分,应该是我在外面套了个贪心,找到大于当前点的最小值再走,所以回溯的规模小了很多。但是看来不上记忆化的话,肯定是AC不了的。 刚一交完这个,约面试的电话就来了,不过感觉笔试这么差估计是凉了...希望后面面试顺利点呀
点赞 回复 分享
发布于 2020-04-08 17:33
好想找到原题再做做啊😂
点赞 回复 分享
发布于 2020-04-08 17:23
第二题最大费用流裸题啊
点赞 回复 分享
发布于 2020-04-08 17:18
第一题卡了半天还是0……太菜了我😥
点赞 回复 分享
发布于 2020-04-08 17:17
我第二题 回溯+Memory 可以AC
点赞 回复 分享
发布于 2020-04-08 17:13
😂我回溯就过了20%
点赞 回复 分享
发布于 2020-04-08 17:09

相关推荐

用微笑面对困难:你出于礼貌叫了人一声大姐,大姐很欣慰,她真把你当老弟
点赞 评论 收藏
分享
评论
8
17
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务