サイズNの整数の配列が与えられた場合、互いに最も近い要素を持つサイズKのサブセットを効率的に見つけるにはどうすればよいでしょうか?
サブセット (x1、x2、x3、..xk) の近さを次のように定義します。
2 <= N <= 10^5
2 <= K <= N
制約:配列には重複が含まれている可能性があり、並べ替えが保証されていません。
私のブルートフォースソリューションは、大きな N に対して非常に遅く、複数のソリューションがあるかどうかをチェックしません:
N = input()
K = input()
assert 2 <= N <= 10**5
assert 2 <= K <= N
a = []
for i in xrange(0, N):
a.append(input())
a.sort()
minimum = sys.maxint
startindex = 0
for i in xrange(0,N-K+1):
last = i + K
tmp = 0
for j in xrange(i, last):
for l in xrange(j+1, last):
tmp += abs(a[j]-a[l])
if(tmp > minimum):
break
if(tmp < minimum):
minimum = tmp
startindex = i #end index = startindex + K?
例:
N = 7
K = 3
array = [10,100,300,200,1000,20,30]
result = [10,20,30]
N = 10
K = 4
array = [1,2,3,4,10,20,30,40,100,200]
result = [1,2,3,4]