人寿研发,第三题,大家讨论一下吗hhh

题目抽象一下,就是划分一个数组,使得数组被分出来的段数最小,要求每个被分出来的数组排序之后都是一个公差大于1等差数列的子序列;
我的想法是:
1.对于i-j之间的数据考虑排序之后是否可以是一个满足条件的等差数列,等差数列的判别我是这样做的:先排序,考虑:长度为1,True,长度为2判断不相邻就True,其余的,计算一下和这段数组中最小的的差值,然后对这个差值进行质因子分解,然后判断是否有相同的质因子(还应该判断一下是否有重复的元素,这个确实没考虑到,但是一个点都没过我觉得很过分),如果没有相同的质因子了,返回flase
2.然后做一次dfs,考虑每个元素成为开头或者加到之前的队尾中, 计算最少的组合;
想问问大佬们,这个思路为啥一个点都过不去
def get_num(t):
    s = set()
    i = 2
    while i**2 <= t:
        if t%i==0:
            s.add(i)
        while t%i == 0:
            t//=i
        i += 1
    if t!=1:
        s.add(t)
    return s

def if_same(nums):
    if len(nums)<=1:
        return True
    nums.sort()
    if len(nums) == 2 and nums[0]<nums[1]-1:
        return True
    start = nums[0]
    s_start = get_num(nums[1]-nums[0])
    for i in range(2,len(nums)):
        s_i = get_num(nums[i]-nums[0])
        if not (s_i & s_start) :
            return False
        s_start = s_i & s_start
    return True


def dfs(idx,path,howmany):
    global res
    if idx>=len(data):
        res = min(res,howmany)
        return
    path.append(data[idx])
    
    if if_same(path):
        dfs(idx+1,path,howmany)
        
    dfs(idx+1,[data[idx]],howmany+1)

n = int(input())
data = list(map(int,input().split()))
res = float('inf')
dfs(0,[],1)
print(res)


#笔试##中国人寿##笔试题目#
全部评论
同求答案 帮顶
1 回复 分享
发布于 2021-09-29 21:01
帮顶
点赞 回复 分享
发布于 2021-09-29 22:24
帮顶
点赞 回复 分享
发布于 2021-10-01 10:46

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
2 4 评论
分享
牛客网
牛客企业服务