def distance(box1, box2):
w1, h1 = box1
w2, h2 = box2
S1 = min(w1, w2) * min(h1, h2)
S2 = w1 * h1 + w2 * h2 - S1
d = 1 - S1 / S2
return d
class KMeans:
def __init__(self, N, K, boxes):
self.N = N
self.K = K
self.boxes = boxes
self.group = [0 for _ in range(N)]
self.count = [0 for _ in range(K)]
self.centers = list(boxes[:K])
return
def k_means(self, T, max_error=1.0e-4):
step = 0
error = 1.0
while step < T and error > max_error:
self.create_group()
centers_cur = self.cal_center()
error = self.cal_error(centers_cur)
self.centers = centers_cur
step += 1
return
def cal_error(self, centers_cur):
error = 0.0
for ii in range(self.K):
error += distance(self.centers[ii], centers_cur[ii])
return error
def create_group(self):
count = [0 for _ in range(self.K)]
for ii in range(self.N):
d = float('inf')
for jj in range(self.K):
d1 = distance(self.boxes[ii], self.centers[jj])
if d1 < d:
d = d1
self.group[ii] = jj
count[self.group[ii]] += 1
self.count = count
return
def cal_center(self):
centers = self.centers
for ii in range(self.K):
if self.count[ii] > 0:
w = 0
h = 0
for jj in range(self.N):
if self.group[jj] == ii:
w += self.boxes[jj][0]
h += self.boxes[jj][1]
w = w / self.count[ii]
h = h / self.count[ii]
centers[ii] = (int(w), int(h))
return centers
def print_centers(self):
Swh = []
for ii in range(self.K):
w = self.centers[ii][0]
h = self.centers[ii][1]
S = w * h
Swh.append((S, w, h))
Swh.sort(reverse=True)
for ii in range(self.K):
print(Swh[ii][1], Swh[ii][2])
def read_in():
N, K, T = map(int, input().split())
boxes = []
for _ in range(N):
boxes.append(tuple(map(int, input().split())))
boxes = tuple(boxes)
return N, K, T, boxes
if __name__ == '__main__':
readin = read_in()
km = KMeans(readin[0], readin[1], readin[3])
km.k_means(readin[2])
km.print_centers()