|
发表于 2020-4-10 14:46:29
|
显示全部楼层
修好了
- def solve(intervals:list,how:'是否打印最小集合'=False):
- sets = [set(range(i[0],i[1]+1))for i in intervals]
- setses = sets[:]
- u = set()
- while sets:
- n = []
- l = len(sets)
- flg = [True]*l
- for a in range(l-1):
- for b in range(a+1,l):
- c = sets[a].intersection(sets[b])
- if len(c)>=2:
- if c not in n:n.append(c)
- flg[a],flg[b] = False,False
- if flg[a]:n.append(sets[a])
- if flg[-1]:n.append(sets[-1])
- if n == sets:break
- sets = n
- db = [[j for j in sets if len(j.intersection(i))>=2]for i in setses]
- def rm(a,s):
- i = 0
- while i<len(a):
- if s in a[i]:
- a.pop(i)
- else:
- i+= 1
- while db:
- for each in db:
- if len(each)==1:
- u.update({each[0].pop(),each[0].pop()})
- rm(db,each[0])
- break
- else:
- nd = []
- for each in sets:
- n = 0
- for l in db:
- if each in l:n += 1
- nd.append((each,n))
- nd.sort(key=lambda x:x[1],reverse=True)
- u.update({nd[0][0].pop(),nd[0][0].pop()})
- rm(db,nd[0][0])
- if how:print(intervals,'->',u)
- return len(u)
- if __name__ == '__main__':
- print('示例1 输出:',solve([[1, 3], [1, 4], [2, 5], [3, 5]],1))
- print('示例2 输出:',solve([[1, 2], [2, 3], [2, 4], [4, 5]]))
- print('之前错的:',solve([[6, 21], [1, 15], [15, 20], [10, 21], [0, 7]],1))
复制代码 |
|