人寿研发,第三题,大家讨论一下吗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-10-01 10:46
帮顶
点赞 回复 分享
发布于 2021-09-29 22:24

相关推荐

昨天 21:21
已编辑
福州大学 嵌入式工程师
可爱的牛油果在求佛:再给你说一点,之前我的简历像流水账,当时我在面试的时候,面试官说:“你简历上的都是在调包吗?有自己的改进吗?如果没有改进直接调包的话,我觉得没什么可深挖的”。当时给我整懵了。其实大部分确实是在调包,因为我确实就用到这些简单的技术,如果只是把技术要点写在简历上,那没什么好说的,没意思,没什么深挖的。但是调包与调包之间仍存在区别,那就是自己的思考,如果你不把自己的困难摆出来,人家觉得就是简单的调包,有啥难的。其实只有你自己知道这个项目的难点在哪,只有你自己知道为什么要用这个技术,为什么要调这个包,而你需要展示的,不是技术,而是这个“为什么”,这是关键。所以,当你的技术不是很硬核的时候,就要突出自己的思考,这时候“思考”是难点,而当你的简历很硬核,技术很复杂时,技术本身就是难点。
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
昨天 14:12
武汉大学 golang
并没有发笔试,只是顺延了两次,去看官网发现流程结束了
无敌忍耐王:三个工作日没人捞就自动结束了
投递美团等公司10个岗位
点赞 评论 收藏
分享
评论
2
4
分享

创作者周榜

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