python中的组合数(考虑传递性)

时间:2013-08-04 03:01:02

标签: python algorithm python-2.7

我有疑问和解决方案。但解决方案似乎并不能满足所有测试用例:

问题:

变量N表示命名边界(0,N-1) 变量K表示测试用例的数量

每个测试用例的格式为(x,y)......(a,b)

使得if(x,y)给出x,y属于同一个类 如果给定(x,y)和(y,z)x,y,z属于同一类

输出应该是从不同类别中选择2个项目的可能方式的数量

解决方案:

inp=raw_input()
inp1=inp.split(' ')

n=int(inp1[0])
k=int(inp1[1])

classes=[[]for i in xrange(0,n)]
no_classes=0

def in_list(c):
    for i in range(0,no_classes):
        if c in classes[i]:
            return i;

    return -1



for i in range(0,k):
    inp=raw_input()
    inp1=inp.split(' ')
    c1=int(inp1[0])
    c2=int(inp1[1])

    l1=in_list(c1)
    l2=in_list(c2)

    if l1<0 and l2<0:
        classes[no_classes].append(c1)
        classes[no_classes].append(c2)
        no_classes+=1
    elif l1>=0 and l2<0:
        classes[l1].append(c2)
    elif l2>=0 and l1<0 :
        classes[l2].append(c1)
    elif l1>=0 and l2>=0 and l1!=l2:
        classes[l1]=list(set(classes[l1]+classes[l2]))
        del classes[l2]
        no_classes-=1        

tot_combntns=0;

for i in range(0,no_classes):
    for j in range(i+1,no_classes):
        tot_combntns=tot_combntns+len(classes[i])*len(classes[j])

print tot_combntns 


Sample test case : 

6 3
0 1
2 3
4 5

ans : 12

5 4
0 1
1 2
2 3
3 4

ans = 0 because there is only one class(0,1,2,3,4)

但我不确定此解决方案是否满足所有测试用例

1 个答案:

答案 0 :(得分:1)

因为这是一个练习编程挑战,我不会给你答案。如果你有能力,我会告诉你足够的数字。我将它留在我认为合理的难度级别。如果你能够创建对象,执行递归等,那么它应该是直截了当的。如果你不具备这个能力,那么失败这个编程挑战就表明你需要学习更多基础知识。

如果您有一组n项,则从中挑选一对的方式为n*(n-1)/2。从不同类别中选择一对的方式的数量是选择一对的方式的数量减去每个类别从该类别中挑选一对的方式的数量。因此,挑战在于找到每个类并计算每个类。

确定两个元素属于同一类可能涉及许多可能的推理链。例如,规则(a, b), (x,y), (b, y)意味着ax属于同一类。你如何有效地通过所有可能的推理链?一种简单而有效的方法是创建一个对象,该对象可以接受任何元素并将其映射到其类的最小已知成员。 (在引擎盖下,它足以将每个不是最小的元素映射到一个较小的已知元素,并懒洋洋地根据需要找出最小的已知元素。)

弄清楚如何实现我作为练习留下的对象。一旦你拥有它,就要弄清楚如何计算每个班级中有多少人。