我给了一个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
我做错了什么?任何人吗?
答案 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);
}
}