记录编号 290170 评测结果 AAAAAAAA
题目名称 圈奶牛 最终得分 100
用户昵称 GravatarAAAAAAAAAA 是否通过 通过
代码语言 C++ 运行时间 0.029 s
提交时间 2016-08-05 21:02:49 内存使用 0.50 MiB
显示代码纯文本
#include<fstream>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
ifstream fin("fc.in");
ofstream fout("fc.out");
int s[10001],t=0;
struct POINT{
	double x;
	double y;
}p[10001];
bool cmp(POINT a,POINT b){
	return (a.x-p[0].x)*(b.y-p[0].y)-(b.x-p[0].x)*(a.y-p[0].y)>0;}
double dist(POINT a,POINT b){//求两点距离
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
bool panduan(POINT a,POINT b,POINT c){//判断偏转方向
	return ((b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x))>0;//说明向顺时针方向偏
}
void exchange(POINT &a,POINT &b){
	POINT c;
	c=a;a=b;b=c;}
void push(int x){
	s[t]=x;t++;}
int main(){
	int n,i;
	double ans=0;
	fin>>n;
	for(i=0;i<n;i++){
		fin>>p[i].x>>p[i].y;
		if(p[i].y<p[0].y){
			exchange(p[0],p[i]);}
		if(p[i].y==p[0].y&&p[i].x<p[0].x){
			exchange(p[0],p[i]);}}
	sort(p+1,p+n,cmp);
	push(0);push(1);push(2);
	for(i=3;i<n;i++){
		while(!panduan(p[s[t-1]],p[i],p[s[t-2]])){
			t--;}
		push(i);}
	for(i=1;i<t;i++){
		ans+=dist(p[s[i]],p[s[i-1]]);}
	ans+=dist(p[s[t-1]],p[0]);
	fout<<setiosflags(ios::fixed)<<setprecision(2)<<ans;
	return 0;
}