【2018icpc北京網路賽】【數學】【貪心】【思維】【條件極值】
阿新 • • 發佈:2018-12-11
【連結】
【題意】
已知 :sigma | ai |=r
最小化:sigma ((bi-ai)^2)
求每個ai
【分析】
將中心點移動到原點。相當於:要ai-1,顯然是大的那個數-1比較小。然後想象一下,最後的ai一般來說都是,幾個數都是最大的數,其餘數不改變。那麼我們二分這個減少後的最大的數。然後求出ans
【程式碼】
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 6; const double eps = 1e-4; double a[maxn]; double o[maxn]; double c[maxn]; double ans[maxn]; int main() { int t; scanf("%d", &t); while (t--) { int n, k; double r; scanf("%d%d%lf", &n, &k, &r); for (int i = 0; i < k; i++) { scanf("%lf", &o[i]); } for (int i = 0; i < n; i++) { for (int j = 0; j < k; j++) { scanf("%lf", &a[j]); c[j] = fabs(a[j] - o[j]); } double L = 0; double R = 1e18; double mid; while (R-L>= eps) { mid = (L + R) / 2; double sum = 0; for (int j = 0; j < k; j++) { sum += max(0.0, c[j] - mid); } if (sum > r) { L = mid; } else { R = mid; } } for (int j = 0; j < k; j++) { if (c[j] >= R)c[j] = R; if (a[j] > o[j])ans[j] = -c[j] + a[j]; else ans[j] = c[j] + a[j]; printf("%.5f ", ans[j]); } printf("\n"); } } }