zoukankan      html  css  js  c++  java
  • UVA 11168 Airport(凸包)

    Airport

    【题目链接】Airport

    【题目类型】凸包

    &题解:

    蓝书274页,要想到解析几何来降低复杂度,还用到点到直线的距离公式,之后向想到预处理x,y坐标之和,就可以O(1)查到距离,还是很厉害的.
    但我还是不知道为什么最后输出ans要除n?希望大佬看见可以评论告诉我一下.

    &代码:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    using namespace std;
    struct Point {
    	double x,y;
    	Point(double x=0,double y=0):x(x),y(y) {}
    };
    typedef Point Vector;
    Vector operator + (const Vector& A,const Vector& B) {return Vector(A.x+B.x , A.y+B.y);}
    Vector operator - (const Vector& A,const Vector& B) {return Vector(A.x-B.x , A.y-B.y);}
    bool operator < (const Point& a,const Point& b) {return a.x<b.x||(a.x==b.x&&a.y<b.y);}
    bool operator == (const Point& a,const Point& b) {return a.x==b.x&&a.y==b.y;}
    double Cross(const Vector&A,const Vector& B) {return A.x*B.y-A.y*B.x;}
    Vector Rotate(const Vector& A,double a) {return Vector(A.x*cos(a)-A.y*sin(a) , A.x*sin(a)+A.y*cos(a));}
    vector<Point> ConvexHull(vector<Point>  p) {
    	sort(p.begin(),p.end());
    	p.erase(unique(p.begin(), p.end()),p.end());
    	int n=p.size();
    	vector<Point> ch(n+1);
    	int m=0;
    	for(int i=0; i<n; i++) {
    		while(m>1&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--;
    		ch[m++]=p[i];
    	}
    	int k=m;
    	for(int i=n-2; i>=0; i--) {
    		while(m>k&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--;
    		ch[m++]=p[i];
    	}
    	if (n>1) m--;
    	ch.resize(m);
    	return ch;
    }
    int n,K;
    int main() {
    	freopen("e:1.in","r",stdin);
    	int T; scanf("%d",&T);
    	while(T--) {
    		vector<Point> p;
    		scanf("%d",&n);
    		double sux=0,suy=0;
    		for(int i=0; i<n; i++) {
    			double x,y;
    			scanf("%lf%lf",&x,&y);
    			sux+=x,suy+=y;
    			p.push_back(Point(x,y));
    		}
    		vector<Point> te=ConvexHull(p);
    		int z=te.size();
    		te.push_back(te[0]);
    		double ans=1e15;
    		// printf("%f %f
    ", sux,suy);
    		if(z<=2) {
    			ans=0;
    		}
    		else {
    			for(int i=1; i<te.size(); i++) {
    				double A=te[i].y-te[i-1].y,B=te[i-1].x-te[i].x,C=te[i].x*te[i-1].y-te[i-1].x*te[i].y;
    				ans=min(ans,fabs(A*sux+B*suy+C*n)/sqrt(A*A+B*B));
    			}
    		}
    		printf("Case #%d: %.3f
    ", ++K, ans/n);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Android客户端与PCServer端socket通信加密方法
    Android的进程优先级与进程回收
    Android学习下载网络图片
    Java Socket通信实现文件传输/图片传输
    python 知识整理
    vmware 安装 centos8 步骤
    mysql 开启事务的 sql 写法
    团队项目七天冲刺 第二天
    测试的计划和执行
    Contentdisposition
  • 原文地址:https://www.cnblogs.com/s1124yy/p/6759811.html
Copyright © 2011-2022 走看看