python中的不可分子集
我得到了一个由n个整数组成的集合S,并且必须打印S的最大子集S'的大小,其中S'中任意2个数字的和不能被k整除 输入格式 第一行分别包含两个空格分隔的整数n和k。 第二行包含n个空格分隔的整数,用于描述集合的唯一值 我的代码:python中的不可分子集,python,Python,我得到了一个由n个整数组成的集合S,并且必须打印S的最大子集S'的大小,其中S'中任意2个数字的和不能被k整除 输入格式 第一行分别包含两个空格分隔的整数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
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
输入:
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
预期输出:
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
我的输出:
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
我做错了什么?任何人?您可以使用以下方法在
O(n)
时间内解决此问题:
# 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
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)
是的,解决这个问题是非常可能的。正如planetp正确指出的,它与我用java编写的解决方案几乎相同。添加注释以更好地理解
导入java.io。;导入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<>();
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);
}
}
公共类解决方案{
静态打印流输出=System.out;
公共静态void main(字符串[]args){
/*在此处输入代码。从STDIN读取输入。将输出打印到STDOUT。您的类应命名为Solution*/
扫描仪输入=新扫描仪(系统输入);
int n=in.nextInt();
int k=in.nextInt();
int[]A=新的int[n];
对于(int i=0;i)您的代码做了一些与问题完全无关的事情。这不是您做错了什么小细节的问题。@C14L:如果不选择两个加起来是k的倍数的元素,您可以选择s的多少个元素?@user2357112那么len([x代表itertools.compositions(a,2)if operator.add(*x)%k])
?@C14L:您仍然在解决错误的问题。@user2357112我得到了正确的解决方案。剩余的项中没有一项[(1,7),(1,4),(7,4)]
可以组合成可被k
整除的指数时间,但至少它通常给出了正确的答案。返回0
是一个错误的值。它只适用于n=0。当输入至少有一个元素时,我们总是可以选择一个有效的1元素子集。是的。指数时间。你希望我中断吗NP套装?付给我1000000美元(CMI奖)我会试试XDDDDY,你不需要解P/NP就可以在线性时间内做到这一点。有一个相当简单的解决方案,它基于决定是否允许在你的集合中为每个可能的x
使用剩余0
或k/2
的特殊情况。将其作为答案发布,并进行我的投票)。我今天太笨了。这是一个非常棒的答案,更深入地解释了这个算法:兄弟。这行是什么意思?res+=bool(L[I])
Incrementres
如果L[I]
是“真”(非零)@planetp,它类似于!L[I].nil?
inruby@Eswar/
表示楼层分割,即先分割,然后向下取整。3/2=1.5,3//2=1如果要存储值,我将使用哈希集,而不是映射