阿里笔试0325第二,三题简单思路

首先我没全对,发出来只是抛砖引玉
/**  * 牛牛上幼儿园,有5个数,每次选择4个数进行减一操作,牛牛没学过负数,所以减到0就停止了。 问最多可以减多少次。 * 输入  * 2  (两行)
* 1 2 3 4 5  * 1 1 1 1000 1  * 输出  * 3  * 1

考虑情况一,五个数最小的两个不同,例如1,2,3,4,5,首先将1置为不选,则可以减至1,1,2,3,4,转移至情况二

情况二,五个数两个最小的相同,例如2,2,3,4,5,依次将1和2置为不选,则可以减至1,1,1,2,3,转移至情况三
我们将一次这样的操作称为操作二,一次操作二会将第,3,4,5个数减二,第1,2个数减一,结果加二

情况三,五个数三个最小的相同,例如4,4,4,7,8,依次将1,2,3置为不选,则可以减至2,2,2,4,5,每次这样的操作可以使数3和数4差减一,反复进行直至情况四
我们将一次这样的操作称为操作三,一次操作三会将第,4,5个数减三,第1,2,3个数减二,结果加三

以此类推,同时做下限边界检查,即进行以此操作一/二/三/四将会使某些数减至负,例如1,1,1,4,5,应当进行以此操作三,但是操作三会减到-1,所以直接判定结束,结果加数一
复杂度为O(n),n为数的数量,这里n为5固定,所以复杂度为O1


第三题
* 给你几条线段,满足ax+by=c,问相交点个数最多的线段的个数
     * 输入
     * 3
     * 1 -1 -1
     * 1 -1 0
     * 1 1 0
     * 输出
     * 2(因为一条线段和另外两条线段相交,有两个交点)

这个问题首先进行简化,将所有平行线分成同一组,最后变成x组线,将这x组线分成黑白两大组,使之乘积最大

这个分组使用贪心即可,对x组线排序,从大到小,遍历,将第x组线插入此时黑白组数量较少的那一组中
black = 0
white = 0
for line in lines:
    if white >= balck:
        black += line
    else:
        white += line

result = white * black


#阿里笔试2020##阿里巴巴##笔试题目#
全部评论
贪心??这题不是背包吗,你的目标是让它接近n/2
点赞 回复 分享
发布于 2022-03-25 13:34
01背包
点赞 回复 分享
发布于 2022-03-25 13:41
这种情景题,藏的太深了,不会做呀😭😭
点赞 回复 分享
发布于 2022-03-25 16:17
第二题直接让每次减1的4个数时当前数组中最大的4个数就行了,5个数每次减完sorted排序,减的时候最小的数出栈,排序的时候入栈就行了。 def max_sub():     nums=[int(i) for i in list(input().split())]     curr=[]     ans=0     nums=sorted(nums)     curr.append(nums.pop(0))     while min(nums)>0:         for i in range(len(nums)):             nums[i]-=1         ans+=1         nums.append(curr.pop())         nums = sorted(nums)         curr.append(nums.pop(0))     return print(ans)
点赞 回复 分享
发布于 2022-04-02 19:16

相关推荐

不愿透露姓名的神秘牛友
2024-12-29 00:19
快手 Java工程师 26.0k*16.0
点赞 评论 收藏
分享
评论
3
10
分享
牛客网
牛客企业服务