hdu1392 Surround the Trees 【简单凸包】

题意:

给你n个点,求将所有点都围起来的凸包的周长

题目链接:传送门

关于凸包的原理:传送门

AC_code:

#include<bits/stdc++.h>
using namespace std;
#define ll long long

const int N = 1e5 + 10, M = 30005, mod = 1e9 + 7, inf = 0x3f3f3f3f;

struct Point {
	double x, y;
	Point (double x = 0, double y = 0):x(x),y(y) {}
	Point operator + (const Point &b) {
		return Point(x+b.x, y+b.y);
	}
	Point operator - (const Point &b) {
		return Point(x-b.x,y-b.y);
	}
} p[N],res[N];

double dis(Point aa, Point bb) {
	return sqrt((aa.x - bb.x) * (aa.x - bb.x) + (aa.y - bb.y) * (aa.y - bb.y));
}
double dot(Point aa, Point bb) {
	return aa.x * bb.y - bb.x * aa.y;
}
bool cmp(Point aa, Point bb) {
	if(aa.y == bb.y) {
		return aa.x < bb.x;
	} else {
		return aa.y < bb.y;
	}
}

int get(Point* p, int n, Point* res) {
	sort(p+1, p+1+n, cmp);
	res[1] = p[1];
	res[2] = p[2];
	int top = 2, len;
	for(int i = 3; i <= n; i++) {
		while(top >= 2 && dot((p[i] - res[top - 1]), (res[top] - res[top-1])) >= 0) {
			top--;
		}
		res[++top] = p[i];
	}
	len = top;
	for(int i = n; i >= 1; i--) {
		while(top != len && dot((p[i] - res[top - 1]), (res[top] - res[top-1])) >= 0) {
			top--;
		}
		res[++top] = p[i];
	}
	return top;
}


int main() {
	int n;
	while(~scanf("%d", &n)) {
		if(n == 0) {
			break;
		}
		for(int i = 1; i <= n; i++) {
			scanf("%lf%lf", &p[i].x, &p[i].y);
		}
		if(n == 1) {
			printf("0.00\n");
			continue;
		} else if(n == 2) {
			printf("%.2lf\n",dis(p[1], p[2]));
			continue;
		}

		int m = get(p, n, res);
		double tot = 0;
		for(int i = 2; i <= m ; i++) {
			tot += dis(res[i-1], res[i]);
		}
		printf("%.2lf\n", tot);
	}
	return 0;
}

 

全部评论

相关推荐

11-27 17:35
已编辑
蚌埠坦克学院 C++
深信服 后台开发 n×12
点赞 评论 收藏
分享
秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
死在JAVA的王小美:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,我也是,让我免了一轮,但是硬气拒绝了
点赞 评论 收藏
分享
totoroyyw:千年老妖😂
投递华为等公司10个岗位
点赞 评论 收藏
分享
oppo 应用软开 22*15+0.5*12
拿到了ssp完美:真的坎坷,但是你至少拿到这么多offer了!
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务