阿里笔试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