在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了N堆。果园是一个二维平面,第i堆果子的位置为(Xi,Yi),重量为Wi。
多多决定把所有的果子合成一堆。每一次合并,多多可以消耗Wi (|Xi - Xj |+|Yi - Yj |)的体力把第i堆果子合并到第j堆。可以看出,所有的果子经过N-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
请你求出将所有果子合并成一堆消耗的总体力最少是多少。
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了N堆。果园是一个二维平面,第i堆果子的位置为(Xi,Yi),重量为Wi。
多多决定把所有的果子合成一堆。每一次合并,多多可以消耗Wi (|Xi - Xj |+|Yi - Yj |)的体力把第i堆果子合并到第j堆。可以看出,所有的果子经过N-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
请你求出将所有果子合并成一堆消耗的总体力最少是多少。
第一行一个正整数N,接下来N行每行三个正整数 Xi Yi Wi
一个数,最少消耗的总体力
4 2 1 1 1 2 3 3 1 2 2 4 2
14
数据约定: 20% N≤10 60% N≤1000 100% N≤100000,Xi,Yi,Wi≤100000
importjava.util.Arrays;importjava.util.Comparator;importjava.util.Scanner;publicclassMain {finalintMAXN = (int) (1e5 + 7);classPoint {longx, y, w;Point(intx, inty, intw) {this.x = x;this.y = y;this.w = w;}}Point find(Point[] a, longtotal) {intcnt = 0;longhalf = total >> 1;for(Point i : a) {cnt += i.w;if(cnt >= half) {returni;}}returna[a.length - 1];}Main() {Scanner cin = newScanner(System.in);intN = cin.nextInt();Point[] a = newPoint[N];longtotal = 0;for(inti = 0; i < N; i++) {a[i] = newPoint(cin.nextInt(), cin.nextInt(), cin.nextInt());total += a[i].w;}Arrays.sort(a, Comparator.comparingInt(m -> (int) (m.x)));longx = find(a, total).x;Arrays.sort(a, Comparator.comparingInt(m -> (int) (m.y)));longy = find(a, total).y;Arrays.sort(a, Comparator.comparingInt(m -> (int) (Math.abs(m.x - x) + Math.abs(m.y - y))));longans = Long.MAX_VALUE;for(intj = 0; j < Math.min(50, N); j++) {longs = 0;for(Point i : a) {s += i.w * (Math.abs(i.x - a[j].x) + Math.abs(i.y - a[j].y));}ans = Math.min(ans, s);}System.out.println(ans);}publicstaticvoidmain(String[] args) {newMain();}}