凸包bzoj1670

来源:互联网 发布:处理器加速优化 编辑:程序博客网 时间:2024/06/05 11:34
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;struct pointt{int x,y;pointt(){}};pointt point[6000],tubao[6000];pointt operator-(pointt a, pointt b){pointt c;c.x = a.x - b.x; c.y = a.y - b.y;return c;}double dot(pointt a, pointt b){return a.x*b.y - a.y*b.x;}double dist(pointt a, pointt b){double kk = (double)((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));return sqrt(kk);}struct linee{pointt p1, vec;linee(pointt a, pointt b) :p1(a), vec(b - a){}linee(){}};linee shape[6000];bool com(pointt a, pointt b){double t = dot(a-point[0], b-point[0]);if (t == 0)return dist(a, point[0]) < dist(b, point[0]);return t > 0;return false;}bool isonleft(pointt test, linee std){pointt c = test - std.p1;return dot(c, std.vec) <=0;}int n;double ans;void  graham(){sort(point + 1, point + n + 1, com);//for (int i = 1; i <= n; i++)//{//cout << "x:" << point[i].x << " " << "y:" << point[i].y << endl;//}tubao[0] = point[1]; tubao[1] = point[2]; //shape[0] = linee(tubao[0], tubao[1]);int last = 1;for (int i = 3; i <= n; i++){while (last >= 1 && isonleft(tubao[last], linee(tubao[last - 1], point[i])))last--;tubao[++last] = point[i];}for (int i = 1; i <= last; i++){ans += dist(tubao[i], tubao[i - 1]);if (i == last)ans += dist(tubao[0], tubao[i]);}}int main(){scanf("%d", &n);pointt min;min.x = 1000000000; min.y = 1000000000;for (int i = 1; i <=n; i++){int a, b;scanf("%d%d", &a, &b);point[i].x = a; point[i].y = b;if (b < min.y || (b == min.y&&a < min.x))min = point[i];}point[0] = min;graham();printf("%.2lf\n", ans);}

原创粉丝点击