반응형

https://leetcode.com/problems/best-position-for-a-service-centre/submissions/

 

Best Position for a Service Centre - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

const double EPSILON = 1e-6;

class Solution {
public:
    double distance(double cx, double cy, int x, int y){
        return sqrt((cx-x)*(cx-x) + (cy-y)*(cy-y));
    }
    
    
    double distanceSum(const vector<vector<int>>& positions, double x, double y){
        double res = 0;
        
        for(auto& v : positions)
            res += distance(x, y, v[0], v[1]);
        
        return res;
    }
    
    
    double findMax(const vector<vector<int>>& positions, double x){
        double y1 = 0, y2 = 100;
        
        while(abs(y2-y1)>EPSILON){
            double midy1 = (2*y1 + y2)/3;
            double midy2 = (y1 + 2*y2)/3;
            double z1 = distanceSum(positions, x, midy1);
            double z2 = distanceSum(positions, x, midy2);
            
            if(z1 > z2) y1 = midy1;
            else y2 = midy2;
        }
        
        return distanceSum(positions, x, (y1+y2)/2);
        
    }
    
    double getMinDistSum(vector<vector<int>>& positions) {
        double x1 = 0, x2 = 100;
        
        while(abs(x1-x2)>EPSILON){
            double midx1 = (2*x1+x2)/3;
            double midx2 = (x1+2*x2)/3;
            double z1 = findMax(positions, midx1);
            double z2 = findMax(positions, midx2);
            
            if(z1 > z2){
                x1 = midx1;
            }
            else{
                x2 = midx2;
            }
        }
        return findMax(positions,(x1 + x2) / 2);
    }
};
반응형

+ Recent posts