zoukankan      html  css  js  c++  java
  • luogu1742 最小圆覆盖

    狗题卡我精度……sol

    #include <algorithm>
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <ctime>
    #include <cmath>
    using namespace std;
    int n;
    struct Point{
    	double x, y;
    }pt[100005], O;
    double r;
    const double eps=1e-10;
    double dis(const Point &u, const Point &v){
    	return sqrt((u.x-v.x)*(u.x-v.x)+(u.y-v.y)*(u.y-v.y));
    }
    void getO(const Point &u, const Point &v, const Point &w){
    	double a=u.x-v.x;
    	double b=u.y-v.y;
    	double c=v.x-w.x;
    	double d=v.y-w.y;
    	double e=a*(u.x+v.x)+b*(u.y+v.y);
    	double f=c*(v.x+w.x)+d*(v.y+w.y);
    	O.x = (e*d-b*f)/(a*d-c*b)/2;
    	O.y = (c*e-a*f)/(b*c-a*d)/2;
    }
    bool inCircle(const Point &u){
    	return dis(u,O)<=r+eps;
    }
    int main(){
    	srand(time(NULL));
    	cin>>n;
    	for(int i=1; i<=n; i++)
    		scanf("%lf %lf", &pt[i].x, &pt[i].y);
    	random_shuffle(pt+1, pt+1+n);
    	O = pt[1];
    	for(int i=1; i<=n; i++)
    		if(!inCircle(pt[i])){
    			O = pt[i];
    			for(int j=1; j<i; j++)
    				if(!inCircle(pt[j])){
    					O = (Point){(pt[i].x+pt[j].x)/2, (pt[i].y+pt[j].y)/2};
    					r = dis(pt[i], pt[j]) / 2.0;
    					for(int k=1; k<j; k++)
    						if(!inCircle(pt[k])){
    							getO(pt[i], pt[j], pt[k]);
    							r = dis(O, pt[k]);
    						}
    				}
    		}
    	printf("%.10f
    %.10f %.10f
    ", r, O.x, O.y);
    	return 0;
    }
    
  • 相关阅读:
    1+x LNMP + WordPress
    1+X Samba
    1+X NFS
    1+x FTP
    1+x LVM
    笔记(全)
    前端性能优化整理总结
    Event Loop我知道,宏任务微任务是什么鬼?
    深入探讨深拷贝浅拷贝两兄弟
    react后台管理系统路由方案及react-router原理解析
  • 原文地址:https://www.cnblogs.com/poorpool/p/8798763.html
Copyright © 2011-2022 走看看