三分求解 ~
也可以求导后求导数值为0
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#include <map>
using namespace std;
struct point
{
double x, y;
};
point a[100010];
int n;
double getdis(double d)
{
double sum = 0;
for(int i = 1; i <= n; ++ i)
{
sum += sqrt((a[i].x-d)*(a[i].x-d)+a[i].y*a[i].y);
}
return sum;
}
int main()
{
int t, ca = 0;
scanf("%d", &t);
while(t --)
{
double _min, _max;
scanf("%d", &n);
scanf("%lf%lf", &a[1].x, &a[1].y);
_min = min(a[1].x, a[1].y);
_max = max(a[1].x, a[1].y);
for(int i = 2; i <= n; ++ i)
{
scanf("%lf%lf", &a[i].x, &a[i].y);
_min = min(_min, min(a[i].x, a[i].y));
_max = max(_max, max(a[i].x, a[i].y));
}
while(_max-_min > 1e-8)
{
double mid = (_min+_max)/2;
double midl = (mid+_max)/2;
double a = getdis(mid), b = getdis(midl);
if(b < a) _min = mid;
else _max = midl;
}
printf("Case %d: %.6lf\n", ++ca, _min);
}
return 0;
}