从最大的开始计算直到最小的,结果的总weight会是最小值,虽然不会证明。。但直觉上是这样,AC了
#include<stdio.h> #include<math.h> #include<stdlib.h> int cmp1543(const void *p1, const void *p2) { return *(int *) p2 - *(int *) p1; } int main() { int n; while (scanf("%d", &n) != EOF) { int *array = (int *) malloc(n * sizeof(int)); int i, total = n; double r; while (n--) scanf("%d", array + n); qsort(array, total, sizeof(int), cmp1543); r = *array; for (i = 1; i < total; i++) { r = 2 * sqrt(*(array + i) * r); } printf("%.3lf\n", r); free(array); } return 0; }