贪心,整数区间

来源:互联网 发布:python语言介绍 编辑:程序博客网 时间:2024/05/16 12:27
整数区间【问题描述】
我们定义一个整数区间[a,b]:是一个从a开始至b 结束的连续整数的集合。编一个程序,对给定的 n个区间,找出满足下述条件的所含元素个数最少的集合中元素的个数:对于所给定的每一个区间,都至少有两个不同的整数属于该集合。(1≤n≤1000,
0≤a≤b≤1000)
【输入格式】
第一行一个正整数n,接下来有n行,每行给定一个区间的a,b值。
【输出格式】
一个正整数,即满足条件的集合所包含的最少元素个数。
【样例】
输入:
4
3 6
2 4
0 2
4 7
输出:
4


==========================================================================

题目讲解什么的:
 
首先题目的意思:
找出一个区间满足下列条件:
1包含输入的区间中至少两个整数。
2所含元素最少。
输出所求区间的元素数。

然后手工怎么找出呢

以例子为讲解的例子
3 6
2 4
0 2
4 7
我们在纸上这样吧它们列出来:
a$$$$$$3 4 5 6
b$$$$2 3 4
c0 1 2
d$$$$$$$$4 5 6 7
对于1,2,3,4,5,6,7(设为all_range)一定是符合条件1的,但是不合条件2,所以对all_range进行删除,删除0,all_range满足abcd,删除1,不满足c,所以1不可删,依次列推,可以得出最后的列表结果是[1,2,4,6]
因此答案是4


==========================代码实现什么的=============================================


一:

n = input("n=?")input_list = []for i in range(1,n + 1):    input_list.append(raw_input("a,b=?"))#n = 4#input_list = ["3 6","2 4","0 2","4 7"]input_list = [(int(i.split(" ")[0]),int(i.split(" ")[1])) for i in input_list]a_list = [i[0] for i in input_list]b_list = [i[1] for i in input_list]all_range = range(min(a_list),max(b_list) + 1)def judge(j_list,result_list):    j = 0    for i in j_list:        if i in result_list:            j += 1    if j>=2:        return 1    else:        return 0j = 0for i in range(0 , len(all_range)):    i = all_range[j]    all_range.remove(i)    for k in input_list:        if judge(range(k[0],k[1]+1),all_range) != 1:            all_range.append(i)print len(all_range)



def fuck(l,judge = lambda j_list,result_list:len([i for i in j_list if i in result_list])>=2):    all_range = range(min([i[0] for i in l]),max([i[1] for i in l]))    for i in range(0,len(all_range)):        del all_range[0]        for k in l:            if judge(range(k[0],k[1]+1),all_range) != 1:                all_range.append(i)    return len(all_range)print (lambda n:(lambda l:fuck(l))([map(lambda i:int(i),raw_input("a,b=?").split(" ")) for i in range(n)]))(input("n=?")) 



 f = lambda L: (lambda t: (([([not filter(t[1:].__contains__, range(j, k+1))[1:] and t.append(t[0]) for j, k in L], t.pop(0)) for i in range(len(t))], len(t))[1]))((range(min(L)[0], max([i[1] for i in L]))))print f([[3, 6], [2, 4], [0, 2], [4, 7]])#by April4


原创粉丝点击