Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 8038 | Accepted: 2375 |
Description
Input
Output
Sample Input
3 3 4 2 6 2 7 5 2 6 3 9 2 0 8 0 6 5 -1
Sample Output
0.50 27.00
经典题目:
代码:
/* *********************************************** Author :_rabbit Created Time :2014/5/10 16:26:51 File Name :20.cpp ************************************************ */ #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <limits.h> #include <string> #include <time.h> #include <math.h> #include <queue> #include <stack> #include <set> #include <map> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-5 #define pi acos(-1.0) typedef long long ll; int dcmp(double x){ if(fabs(x)<eps)return 0; return x>0?1:-1; } struct Point{ double x,y; Point(double _x=0,double _y=0){ x=_x;y=_y; } }; Point operator + (const Point &a,const Point &b){ return Point(a.x+b.x,a.y+b.y); } Point operator - (const Point &a,const Point &b){ return Point(a.x-b.x,a.y-b.y); } Point operator * (const Point &a,const double &p){ return Point(a.x*p,a.y*p); } Point operator / (const Point &a,const double &p){ return Point(a.x/p,a.y/p); } 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 dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0; } double Dot(Point a,Point b){ return a.x*b.x+a.y*b.y; } double Length(Point a){ return sqrt(Dot(a,a)); } double Angle(Point a,Point b){ return acos(Dot(a,b)/Length(a)/Length(b)); } double angle(Point a){ return atan2(a.y,a.x); } double Cross(Point a,Point b){ return a.x*b.y-a.y*b.x; } Point vecunit(Point a){ return a/Length(a); } Point Normal(Point a){ return Point(-a.y,a.x)/Length(a); } Point Rotate(Point a,double rad){ return Point(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad)); } double Area2(Point a,Point b,Point c){ return Length(Cross(b-a,c-a)); } double DistanceToSegment(Point p, Point a, Point b) { if(a == b) return Length(p-a); Point v1 = b-a, v2 = p-a, v3 = p-b; if(dcmp(Dot(v1, v2)) < 0) return Length(v2); else if(dcmp(Dot(v1, v3)) > 0) return Length(v3); else return fabs(Cross(v1, v2)) / Length(v1); } double dis_pair_seg(Point p1, Point p2, Point p3, Point p4) { return min(min(DistanceToSegment(p1, p3, p4), DistanceToSegment(p2, p3, p4)), min(DistanceToSegment(p3, p1, p2), DistanceToSegment(p4, p1, p2))); } vector<Point> CH(vector<Point> p){ sort(p.begin(),p.end()); p.erase(unique(p.begin(),p.end()),p.end()); int n=p.size(); int m=0; vector<Point> ch(n+1); for(int i=0;i<n;i++){ while(m>1&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-1])<=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; } double RC_Distance(vector<Point> ch1,vector<Point> ch2) { int q=0, p=0,n=ch1.size(),m=ch2.size(); for(int i=0;i<n;i++) if(ch1[i].y-ch1[p].y < -eps) p=i; for(int i=0;i<m;i++)if(ch2[i].y-ch2[q].y > eps) q=i; ch1.push_back(ch1[0]);ch2.push_back(ch2[0]); double tmp, ans=1e100; for(int i=0;i<n;i++) { while((tmp = Cross(ch1[p+1]-ch1[p], ch2[q+1]-ch1[p]) - Cross(ch1[p+1]-ch1[p], ch2[q]- ch1[p])) > eps) q=(q+1)%m; if(tmp < -eps) ans = min(ans,DistanceToSegment(ch2[q],ch1[p],ch1[p+1])); else ans = min(ans,dis_pair_seg(ch1[p],ch1[p+1],ch2[q],ch2[q+1])); p=(p+1)%n; } return ans; } double RC_Triangle(vector<Point> res)// 凸包最大内接三角形 { int n=res.size(); if(n<3) return 0; double ans=0, tmp; res.push_back(res[0]); int j, k; for(int i=0;i<n;i++) { j = (i+1)%n; k = (j+1)%n; while((j != k) && (k != i)) { while(Cross(res[j] - res[i], res[k+1] - res[i]) > Cross(res[j] - res[i], res[k] - res[i])) k= (k+1)%n; tmp = Cross(res[j] - res[i], res[k] - res[i]);if(tmp > ans) ans = tmp; j = (j+1)%n; } } return ans/2; } int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); int n,m; while(cin>>n&&n!=-1){ vector<Point> res; Point p; while(n--)scanf("%lf%lf",&p.x,&p.y),res.push_back(p); res=CH(res); printf("%.2lf\n",RC_Triangle(res)); } return 0; }
POJ 2079 凸包最大内接三角形,布布扣,bubuko.com
原文地址:http://blog.csdn.net/xianxingwuguan1/article/details/25496715