python中不可分的子集

时间:2016-05-25 16:50:49

标签: python

我给了一个n个整数的集合S,并且必须打印S的最大子集S'的大小,其中S'中任何2个数字的总和不能被k整除。

输入格式

第一行包含2个以空格分隔的整数,分别为n和k。 第二行包含n个以空格分隔的整数,用于描述集合的唯一值。

我的代码:

import sys


n,k = raw_input().strip().split(' ')
n,k = [int(n),int(k)]
a = map(int,raw_input().strip().split(' '))
count = 0


for i in range(len(a)):
    for j in range(len(a)):
        if (a[i]+a[j])%k != 0:
            count = count+1

print count

输入:

4 3
1 7 2 4

预期输出:

3

我的输出:

10

我做错了什么?任何人吗?

4 个答案:

答案 0 :(得分:16)

您可以使用以下方法在O(n)时间内解决此问题:

L = [0]*k

for x in a: 
    L[x % k] += 1
res = 0
for i in range(k//2+1):
    if i == 0 or k == i*2:
        res += bool(L[i])
    else:
        res += max(L[i], L[k-i])

print(res)

答案 1 :(得分:0)

# given k, n and a as per your input.
# Will return 0 directly if n == 1
def maxsize(k, n, a):
    import itertools
    while n > 1:
        sets = itertools.combinations(a, n)
        for set_ in sets:
            if all((u+v) % k for (u, v) in itertools.combinations(set_, 2)):
                return n
        n -= 1
    return 0

答案 2 :(得分:0)

是O(n)解决这个问题的方法非常有可能。就像planetp一样正确指出了它在java中编写的几乎相同的解决方案。添加了评论以便更好地理解。

  

import java.io. ; import java.util。;

     

公共类解决方案{

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n=in.nextInt();
    int k=in.nextInt();
    int [] arr = new int[k];
    Arrays.fill(arr, 0);
    Map<Integer,Integer> mp=new HashMap<>();
     

考虑到没有重复项,将值存储在地图中。如果有重复项,您可以将它们存储在数组列表中。只有这样你才会有不同的结果。           for(int i = 0; i

    int res=0;

    for(int i=0;i<=(k/2);i++)
    {
        if(i==0 || k==i*2)
        {
            if(arr[i]!=0)
               res+=1;
        }

如果没有。可以被k整除,我们只能有一个,如果no只是k的一半,那么我们只能得到1.如果a&amp; b可以被k除,那么a + b也可以被k整除。同样地,如果c%k = k / 2,那么如果我们有多个这样的没有。他们的组合可以被k整除。因此我们将它们分别限制为1个值。             其他             {                 int p = arr [i];                 int q = arr [k-i];                 如果(p为H. = Q)                     RES + = P;                 其他                     RES + = Q;             }

如果[x]> a [k-x]获得更大的值,则这是简单的数字输出,其更多来自列表中的0到k / 2的列表。即如果我们有k = 4而我们没有。 1,3,5,7,9,13,17。然后a [1] = 4和a [3] = 2因此选择[1]因为1,5,13,​​17可以保持在一起。

    }   
       System.out.println(res);
    }
}

答案 3 :(得分:0)

Java解决方案

public class Solution {

    static PrintStream out = System.out;

    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        Scanner in = new Scanner (System.in);
        int n = in.nextInt();
        int k = in.nextInt();        
        int[] A = new int[n];

        for(int i=0;i<n;i++){
            A[i]=in.nextInt();
        }

        int[] R = new int[k];
        for(int i=0;i<n;i++)            
            R[A[i] % k]+=1;

        int res=0;
        for(int i=0;i<k/2+1;i++){
            if(i==0 || k==i*2)
                res+= (R[i]!=0)?1:0;
            else
                res+= Math.max(R[i], R[k-i]);            
        }

        out.println(res);
    }
}