n 個質點(質量 1)在數軸位置 x[i],繞質心旋轉。可移動 ≤k 個質點到任意位置(疊加允許)。最小化轉動慣量 I = Σ (x_i - x_cm)²。
sum[i] = Σ x[j] 和平方和 sum2[i] = Σ x[j]²cnt = n-kcm = (sum[R]-sum[L-1]) / cntI = (sum2[R]-sum2[L-1]) - 2*cm*(sum[R]-sum[L-1]) + cnt*cm²#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T; cin >> T;
while (T--) {
int n, k; cin >> n >> k;
vector<long long> x(n+1);
for (int i = 1; i <= n; ++i) cin >> x[i];
sort(x.begin()+1, x.end());
if (n <= k || n - k == 1) { cout << "0\n"; continue; }
vector<long long> sum(n+1), sum2(n+1);
for (int i = 1; i <= n; ++i) {
sum[i] = sum[i-1] + x[i];
sum2[i] = sum2[i-1] + x[i]*x[i];
}
int keep = n - k;
double ans = 1e100;
for (int L = 1; L + keep - 1 <= n; ++L) {
int R = L + keep - 1;
double cm = (sum[R] - sum[L-1]) * 1.0 / keep;
double I = (sum2[R] - sum2[L-1]) - 2*cm*(sum[R] - sum[L-1]) + keep*cm*cm;
ans = min(ans, I);
}
printf("%.9f\n", ans);
}
return 0;
}
ans 設大值(非 0)避免 WA